2011-01-14 13 views
2

Dies ist, was ich gerade mache, um Sitzungen auf der Anmeldeseite zu erstellen.PHP Session Security Tipps

if($count==1) { 

    $_SESSION['username'] = $username; 
    $_SESSION['password'] = $password; 
} 

ich weiß, das ist sehr einfach und ich muss die Benutzersitzungen schützen. Kannst du mir ein paar grundlegende Tipps geben? Wenn Sie den Code bearbeiten und den sicheren Code schreiben könnten, wäre das großartig. Vielen Dank.

Derzeit verwende ich die E-Mail-Adresse als Sitzungsbenutzername.

+0

Warum speichern Sie das Passwort im Klartext in/tmp? – rook

Antwort

6

Fragen Sie sich selbst diese Frage:

  • Warum ich das Passwort zu speichern bin, wenn der Benutzername in der Datenbank
  • einzigartig ist

Nachdem Sie beantwortet haben, dass Sie zu dem Schluss kommen aus sollte, dass ihr sinnlos, Sie können entweder den Benutzernamen oder die Benutzer-ID in der Sitzung speichern, wenn es um Anmeldesysteme geht.

Wie Login-Systeme funktionieren, ist, dass der Benutzer das Benutzername-Passwort aus einem Formular an den Server sendet, wo es validiert, während der Validierung wählen Sie den Benutzer aus der Datenbank where username = post_username.

Wenn keine Zeilen gefunden wurden, existiert der Benutzer nicht, so dass Sie die Ausgabe zu diesem Zeitpunkt direkt senden können, wenn der Benutzer existiert, dann vergleichen Sie das Passwort mit dem post_password.

Der Grund, warum wir die Zeile nur durch den Benutzernamen auswählen, ist, dass Sie eine Art Hash-System integrieren sollten, um zusätzliche Sicherheit hinzuzufügen.

Wenn Sie das Passwort als (Passwort + Hash) speichern, was eine neue Zeichenfolge wäre, würden Sie auch nur den Hash speichern. Wenn also ein Benutzer gefunden wird, können Sie einen Hash von (post_password + db_hash) erstellen und prüfen, ob es ist das gleiche wie die db_password.

Auf diese Weise, wenn Ihre Datenbank irgendwie durchgesickert wird, sind Ihre Benutzeranmeldeinformationen sicherer.

Sobald der Benutzer validiert wurde, speichern Sie die Benutzer-ID in der Sitzung und dann können Sie bei jedem Laden der Seite überprüfen, ob die ID innerhalb der Sitzung ist und ob der Benutzer gerade angemeldet ist und Sie auswählen können die Benutzerdaten durch SELECT * FROM users WHERE id = session_id.

Dies sollte Ihnen den Anfang machen.

+0

Gute Erklärung. +1 – jweyrich

1

Allgemein ist es, den Benutzernamen und das Passwort für die Datenbank zu überprüfen, dann beim Erfolg speichern nur die Benutzer-ID in der Sitzung. Um später festzustellen, ob eine Person angemeldet oder autorisiert ist, überprüfen Sie diese Benutzer-ID, die in der Sitzung gespeichert ist. Die Sitzungsvariablen sind jedoch nur für den Server sichtbar, es sei denn, Sie haben etwas schrecklich falsch gemacht. Es ist also nicht schrecklich oder unsicher, aber es ist im Grunde unnötig.

bearbeiten

entfernt Bit über Cookies, könnte Verwirrung stiften.

+0

Warum kann ich nicht einfach den Benutzernamen anstelle einer ID speichern? Ich benutze keinen Keks. – sarthak

+0

@sarthak: weil es in der Regel besser und schneller ist, eine Tabelle nach ihrem Primärschlüssel und nicht nach einer Gruppe anderer Spalten abzufragen.Wenn Sie diese Sitzung zur Authentifizierung verwenden, bedeutet dies, dass Sie auch einen Cookie verwenden, da dies sonst keinen Sinn ergibt. – jweyrich

+1

Sie könnten, aber ich würde nicht, es sei denn Ihr Primärschlüssel, und Sie möchten normalerweise einen INT-Typ für Ihren Primärschlüssel. – profitphp

1
/* 
    SecureSession class 
    Written by Vagharshak Tozalakyan <[email protected]> 
    Released under GNU Public License 
*/ 

class SecureSession { 
    // Include browser name in fingerprint? 
    var $check_browser = true; 
    // How many numbers from IP use in fingerprint? 
    var $check_ip_blocks = 0; 
    // Control word - any word you want. 
    var $secure_word = 'random_string_here'; 
    // Regenerate session ID to prevent fixation attacks? 
    var $regenerate_id = true; 

    // Call this when init session. 
    function Open() 
    { 
     $_SESSION['ss_fprint'] = $this->_Fingerprint(); 
     $this->_RegenerateId(); 
    } 

    // Call this to check session. 
    function Check() 
    { 
     $this->_RegenerateId(); 
     return (isset($_SESSION['ss_fprint']) 

     && $_SESSION['ss_fprint'] == $this->_Fingerprint()); 
    } 

    function Destroy() 
    { 
     // Unset all of the session variables. 
     $_SESSION = array(); 

     // If it's desired to kill the session, also delete the session cookie. 
     // Note: This will destroy the session, and not just the session data! 
     if (isset($_COOKIE[session_name()])) { 
      setcookie(session_name(), '', time()-42000, '/'); 
     } 

     // Finally, destroy the session. 
     session_destroy(); 
    } 


    // Internal function. Returns MD5 from fingerprint. 
    function _Fingerprint() 
    { 
     $fingerprint = $this->secure_word; 
     if ($this->check_browser) 
      $fingerprint .= $_SERVER['HTTP_USER_AGENT']; 

     if ($this->check_ip_blocks) 
     { 
      $num_blocks = abs(intval($this->check_ip_blocks)); 

      if ($num_blocks > 4) 
       $num_blocks = 4; 

      $blocks = explode('.', $_SERVER['REMOTE_ADDR']); 

      for ($i=0; $i<$num_blocks; $i++) 
      { 
       $fingerprint .= $blocks[$i] . '.'; 
      } 
     } 
     return md5($fingerprint); 
    } 

    // Internal function. Regenerates session ID if possible. 
    function _RegenerateId() 
    { 
     if ($this->regenerate_id && function_exists('session_regenerate_id')) 
      session_regenerate_id(); 

    } 
} 
+0

handly gnu class zum Erstellen, Überprüfen und Löschen von sicheren Sitzungen. – dqhendricks

+0

Wenn ich eine Zeit für die Abmeldung festlegen möchte, wie geht das? Wie meine Website Benutzer admin sollte sich nach 15 Minuten Inaktivität abmelden, wie diese Abmeldezeit in dieser Klasse einstellen? – sqlchild