[SESSION] Sicherer Login

Astrodan

Gamma Cephei
ID: 119839
L
10 Dezember 2006
1.113
209
So, ich wollt mich jetzt nochmal etwas intensiver damit beschäftigen, wie man einen Login sicher gestaltet. Deswegen habe ich doch ein paar Fragen, worauf man achten muss.

Login Vorgang verläuft im Allgemeinen wohl folgendermaßen ab:

1. Formular anzeigen
2. Ausgefülltest Formular wird abgeschickt => Datan auslesen
3. Daten mit Datenbank überprüfen (=> Erfolg)
4. Daten in der Session speichern
5. Bei jedem Seitenaufruf Login-Status überprüfen

Bei Punkt 4 und 5 bin ich mir unsicher. Welche Daten soll / kann ich speichern, welche auf keinen Fall? Was muss ich überprüfen, um sicher zu gehen, dass das immernoch der selbe Computer/Browser ist? (den Menschen davor kann ich wohl schlecht kontrollieren ;) )

Was wohl nicht da rein gehört wäre das Passwort.
Daten wie Username oder eine eindeutige ID hingegen müssen wohl irgendwie da drinne stehn, um den Benutzer wieder identifizieren zu können. Aber was brauch ich noch?

Und dann bei der Überprüfung. Eine Überprüfung nach dem Schema isset($_SESSION['user_is_logged_in']) dürfte ja wohl recht unsicher sein. Aber jedes mal ne datenbankabfrage starten und irgendwelche Daten abfragen (welche Daten? Beim Einloggen generierte Hashs, die auch in der Session stehen?) wäre wohl sicher, aber so gesehen relativ aufwändig.

Deswegen mal an alle, die damit Erfahrung haben: Was macht ihr, was haltet ihr für nötig, was sollte ich auf jeden Fall vermeiden?
 
Welche Daten soll / kann ich speichern, welche auf keinen Fall?

Nach Möglichkeit keine sensiblen Daten (z.B. Passwörter etc)

Was muss ich überprüfen, um sicher zu gehen, dass das immernoch der selbe Computer/Browser ist? (den Menschen davor kann ich wohl schlecht kontrollieren ;) )

Da gibt es keine 100%ige Sicherheit.
Identifiziert wird vom Session-System schon über die Sessionid, meiner Meinung nach ist dies ausreichend (aber evtl. noch Mechanismen gegen Session-Hijacking implementieren bzw. die Sessionid nur über Cookies handlen).

Daten wie Username oder eine eindeutige ID hingegen müssen wohl irgendwie da drinne stehn, um den Benutzer wieder identifizieren zu können. Aber was brauch ich noch?

Du hast deine Sessionid, der du vereinfacht ausgedrückt Daten in $_SESSION zuordnest. Somit musst du nur noch die Daten in $_SESSION mit einem Benutzer in Verbindung bringen - z.B. indem du die Benutzerkennung reinspeicherst.

Und dann bei der Überprüfung. Eine Überprüfung nach dem Schema isset($_SESSION['user_is_logged_in']) dürfte ja wohl recht unsicher sein. Aber jedes mal ne datenbankabfrage starten und irgendwelche Daten abfragen (welche Daten? Beim Einloggen generierte Hashs, die auch in der Session stehen?) wäre wohl sicher, aber so gesehen relativ aufwändig.

Wie sollte ein Benutzer kontrollieren, was in $_SESSION['user_is_logged_in'] steht (von völlig irsinnigen Implementierungen mal abgesehen)?
Ob in $_SESSION jetzt das oben angesprochene 'user_is_logged_in' steht oder ein Hash das bleibt sich gleich, da die Daten serverseitig gespeichert werden und somit im Normalfall nicht vom Client manipuliert werden können.
 
Es reicht wenn du in der Session einfach die UserID speicherst. Wenn die gesetzt ist weißt du dass der User eingelogt ist. Was anderes brauchst du nicht unbedingt speichern. Eventuell den Username wenn du den immer wieder brauchst. Z.b. wie hier im Forum Willkommen XXX. Das spart dir eventuell ein Query.

Zum Thema Session-Hijacking... da bemüh dich mal bei Google ;) Das Thema ist vielseitig und eine sichere Lösung gibt es nicht. Ein Tipp noch von mir wenn du keine kontrolle über den Server hast würde ich eine eigene Session Life Time einbauen. Z.B. das nach 10min die Session vernichtet wird, manchmal ist diese Zeit serverseitig imens lange eingestellt. Das ist eigentlich ganz einfach. Beim erzeugen der Session setzt du die akutelle Zeit, und bei jedem aufruf prüfst du ob die Zeit nicht abgelaufen ist, wenn ja ist die Session ungültig, ansonsten aktualisiert du die Zeit in der Session.
 
Also wenn du dich mit Session Hijacking etc. auseinander setzen willst schau mal hier: https://www.petry-newmedia.de/phpsec.pdf Punkt IV.

Dort stehen auch insgesamt Interessante Sachen drin zum Thema Sicherheit in PHP ;)

Ich selber speichere in meinem größeren Script (du dürftest es kennen ;) ) in der Session einmal den Status (ob er eingeloggt ist), seine UserID und die SessionID.
Beim Seitenaufruf überprüft meine Funktion ob die SessionID mit der beim Login in der DB gespeicherten ID übereinstimmt ;) Wenn nicht => Weg mit dem User :p