2009-12-11 16 views
5

Ich habe (bis jetzt) ​​Benutzersitzungen mit clientseitigen Cookies und Datenbankeinträge behandelt.sicheren Umgang mit Client 'Sitzungen' in PHP

Wenn der Benutzer sich anmeldet, erzeuge ich eine GUID und stelle sie in einen Cookie auf dem Computer des Kunden. Dann erstelle ich einen Eintrag in einer 'sessions'-MySQL-Tabelle und füge dort die GUID, die IP-Adresse, den Benutzernamen, die Berechtigungen usw. hinzu. Wenn der Benutzer dann auf die Seite zugreift, überprüfe ich, ob es einen Sitzungscookie gibt. Wenn ja, überprüfe ich die Datenbank auf die GUID im Cookie und stelle sicher, dass die IP-Adresse übereinstimmt. Wenn dies der Fall ist, ist der Benutzer mit den übrigen Informationen in der db-Tabelle angemeldet. Wenn etwas nicht stimmt (schlechte IP-Adresse, abgelaufene Sitzung usw.), entferne ich den Datenbankeintrag und entferne den GUID-Cookie.

Ich habe noch nie die $ _SESSION global zuvor verwendet.

Ist mein Weg eine gute Übung oder muss ich darüber nachdenken, wie ich damit umgehe?

+1

Sie erfinden das Rad mein Freund –

Antwort

7

Es klingt wie Sie die verdeckten Grundlagen haben. Wenn Sie das alles manuell tun, implementieren Sie effektiv nur Ihre eigene $_SESSION, und nutzen nicht die Tatsache, dass es all das für Sie tun kann.

Wenn Sie eine Datenbank zum Behandeln einer Sitzung verwenden möchten, können Sie die Standardsitzungsbehandlung mit Ihrer eigenen überschreiben. Werfen Sie einen Blick auf session_set_save_handler(). Ich mache das in meinen Apps.

class SessionHandler 
{ 

    public function open($save_path, $session_name) 
    { 
     $this->sessionName = $session_name; 
    return(true); 
    } 
    public function close() { 
     //stuff 
    } 

    public function read($id) { 
     $expiretime = date("Y-m-d H:i:s",time() - $this->maxLifeTime); 
     $sql = "SELECT * FROM sessions where sessionid='".$this->db->escapeData($id)."' AND lastupdated>='".$expiretime."' LIMIT 1"; 
    $result = $this->db->query($sql); 
     //etc. 
    } 

    //etc. 

    public function setAsSessionHandler() 
    { 
    session_set_save_handler(
     array($this,'open'), 
     array($this,'close'), 
     array($this,'read'), 
     array($this,'write'), 
     array($this,'destroy'), 
     array($this,'gc') 
    ); 
    } 
} 

$sessionHandler = new SessionHandler(); 
$sessionHandler->setAsSessionHandler(); 

können Sie haben alle Funktionen, die Sie gerade beschrieben, dass Sie sich dies durch den Einsatz implementiert haben, aber immer noch die Leistung von $ _SESSION es für Sie zu tun.

Wenn Sie beispielsweise eine IP-Prüfung hinzufügen möchten, um festzustellen, ob die Sitzung noch gültig ist, bevor Sie sie starten, können Sie dies als Teil der "Öffnen" -Funktion hinzufügen. Wenn Sie die Sitzungsdaten in zehn verschiedene Datenbanken schreiben möchten (nicht das, was Sie tun würden), können Sie dies in der Funktion "Schreiben" erreichen.

Diese Funktionen werden alle basierend darauf verwendet, wie Sie $ _SESSION verwenden, und indem Sie sie in eine einfache Klasse einfügen, können Sie verwalten, wie sie sehr effektiv funktioniert.

Sie werden sehen, dass die Sitzungs-ID ein Parameter ist, der an die Lese-/Schreib-/Löschfunktionen übergeben wird, und Sie werden dies weiterhin auf dieselbe Weise mit Ihrer GUID-Generierungsroutine verwalten.Sie könnten jedoch die GUID-Generation und die Prüfungen in diese Session Manager-Klasse stecken und einfach die open() -Funktion ausführen lassen. Zentralisiert, kein Muss, kein Aufhebens.

1

Die Art, wie Sie es jetzt tun, ist gut, wenn Sie den aktuellen Benutzer irgendwie mit anderen Datenbankinformationen verknüpfen müssen.

Die Verwendung von Sitzungen ist der Einfachheit halber bevorzugt. Ich schlage vor, Sie lesen ein wenig darüber auf www.php.net/sessions und entscheiden Sie sich davon. Es ist sehr einfach zu benutzen, aber es ist weniger flexibel als eine Datenbanktabelle. Sie können weiterhin alle Werte festlegen, die Sie benötigen, aber Sie müssen sie dann abrufen und in die Abfrage einfügen, wenn Sie sie für Datenbankoperationen benötigen.

+0

das ist ein guter Punkt, aber ich denke, zombats Session Handler-Klasse macht die Datenbank Teil der Sitzungen ein wenig nahtloser. –

1

Ich denke, Sie sind auf dem richtigen Weg. Es hängt wirklich von den Sicherheitsanforderungen Ihrer Anwendung ab. Sie können sich $ _SESSION sehr ähnlich zu $ ​​_COOKIE vorstellen: als einen Mechanismus, um den Status zwischen den Seitenaktualisierungen bereitzustellen. In diesem Zusammenhang die Identität Ihres Benutzers. Ihre Datenbank sollte weitere Authentifizierungsmechanismen bereitstellen. Dinge, die Ihren Benutzer eindeutig identifizieren können. Eine typische Annahme ist die IP-Adresse, aber was passiert, wenn sich jemand IP ändert? User-Agent ist eine andere Möglichkeit, aber diese sind nicht sehr einzigartig.

Ich würde einen Blick auf schlage vor: http://php.net/manual/en/session.security.php

+0

Ich denke, die IP-Adresse ist gut genug, insbesondere weil die meisten Leute sowieso hinter Routern sind, und diese IP wird normalerweise (nach meiner Erfahrung) nicht aktualisiert, außer der Router wird zurückgesetzt, normalerweise zusammen mit einem internen Mechanismus, um die IP zu aktualisieren. Selbst wenn die IP-Aktualisierung des Benutzers ein ernstzunehmender Faktor wäre, würde dies bedeuten, dass sich der Benutzer wieder anmelden muss. In meinen eigenen Implementierungen macht ich normalerweise die Sitzung in etwa drei oder vier Stunden ablaufen. –

+0

Das ist alles sehr wahr. Ich habe mehr über mobile Clients nachgedacht. Wenn Sie mit einem Telefon auf die Website zugreifen, ist die Wahrscheinlichkeit, dass sich die IP ändert, höher, wenn diese Person unterwegs ist. Dennoch ist dies in der Regel ein ziemlich kleiner Teil des Internetverkehrs für die meisten Menschen. – Brad

+0

Wenn du nach nahtloser Integration von $ _SESSION mit deiner Datenbank suchst, schau dir die Zend_Auth Komponente des Zend Framework an. – Brad