Hi Sebastian.
ich mache mir gerade Gedanken um bestmögliche Sicherheit bei der Arbeit mit Sessions beim Login.
Wovor willst Du Sicherheit? (Ist ne echte Frage.)
Das Passwort wird als MD5-Hash in der Datenbank gespeichert.
MD5 ist unsicher. Schau Dir mal die SHA-2-Hashes an. Ansonsten suche nach dem Stichwort "Salt" im Archiv.
Login erfolgt wie gewohnt durch Eingabe von Benutzername / Passwort
Ok.
Bei der ersten Prüfung werden Session-Variablen angelegt, auch Benutzername und md5(Passwort).
Benutzername ok, wenn Du ihn im Skript brauchst. Für das Speichern des Passwort-Hashes in der Session gibt es keinen guten Grund.
Bei jedem weiteren Aufruf einer Seite wird nun erneut Benutzername und Passwort überprüft.
Nein! Dazu müsste der Nutzer jedes Mal wieder die Daten senden. Das will er nicht und soll er nicht! Er identifiziert sich nur(!) durch Senden der Session-ID.
Frage:
Ist der letzte Schritt unnötig?
Mehr noch: er ist problematisch. Er erhöht die Sicherheit nicht, und schafft anderesherum evtl. Dritten zusätzliche Möglichkeiten, die Zugangsdaten zu entführen (was u.U. sehr viel schlechter wäre, als "nur" eine Session zu entführen, siehe 3.: unten).
Ist die Arbeit mit Sessions ausreichend sicher, dass es genügen würde, nach der ersten Prüfung ein $_SESSION['Login'] = TRUE/FALSE zu speichern und dies dann bei jedem weiteren Aufruf zu überprüfen?
Das hängt natürlich davon ab, was man für 'ausreichend' erachtet. Aber: Ja. Die Session-ID ist lang genug, um nicht (im probabilistischen Sinne) von Dritten erraten werden zu können. Sie bietet daher alles, was ein (gutes) Passwort auch bietet.
Sollte man dann dabei zur optimalen Sicherheit noch etwas beachten?
Ein paar Anregungen, wenn Du denn sicherheitsfanatisch bist:
1.: Sehr ratsam ist ein automatischer Logout nach einer angemessenen Zeit der Inaktivität (so was wie 10-15 Minuten vielleicht). Denn ein Szenario, in dem eine Session leicht entführt werden kann, ist, dass jemand vergisst, sich auszuloggen und jemand anderes etwa Zugang zu dem Computer hat, bevor die Session abgelaufen ist. Das kannst Du nicht restlos verhindern, und es ist auch nicht in erster Linie Deine Verantwortung, Fehler Deiner Nutzer zu verhindern, aber Du solltest ihnen auf diese Weise so weit wie möglich entgegen kommen.
2.: Wenn Dir danach ist, kannst Du aktiv mit einem Hinweis anregen, dass Deine Nutzer vernünftige Passwörter verwenden und nicht etwa "qwertz" oder dergleichen. (Ich persönlich mag es allerdings ganz gerne, wenn es bei (höchstens) diesem Anregen bleibt und die Anwendung nicht meint, mir irgendein Passwort technisch verbieten zu müssen. Aber auch das solls geben.) Etwas mehr Infos darüber, wann Passwörter vernünftig sind, liefert google sicher gern..
3.: Überlege Dir, wozu man mit einem normalen Login Zugang haben sollte und wozu nicht. Wenn zum Beispiel der Nutzer in irgendwelchen Nutzereinstellungen die Möglichkeit hat, sein Passwort zu ändern, dann sollte das nur mit erneuter Eingabe des alten Passwortes möglich sein. Auf diese Weise kann jemand, der eine Session entführt, zwar vielleicht allerlei Schabernack treiben, aber nicht die Zugangsdaten ändern und damit deren eigentlichen Besitzer aussperren.
4.: Du solltest auf mehrfach gescheiterte Login-Versuche reagieren. Ein einzelner gescheiterter Versuch kann vom Nutzer selber leicht durch Vertipper kommen, bei mehreren aber sollte reagiert werden. Möglichkeiten:
-
Es dem Nutzer beim nächsten Login mitteilen: "Achtung, es gab weit Ihrem letzten Login 7 gescheiterte Login-Versuche. Möglicherweise wurde versucht, ihr Konto zu hacken, und sie sollten evtl. Ihr Passwort ändern."
-
Das Konto für eine gewisse Zeit sperren und keinen Login zulassen.
-
Falls Du seine Email-Adresse gespeichert hast, obige Nachricht per Email an ihn schicken, und ggf. obige Sperre nicht auf eine gewisse Zeit beschränken, sondern ihm in der Email einen Link liefern, mit dem er die Sperre wieder aufheben kann.
Viele Grüße,
der Bademeister