Hallo werte Freunde,
Ich habe mir vor kurzem eine Klasse für ein rudimentäres Login geschrieben, welches auf das Sessionbasierte Loginscript vom Benjamin beruht (finde es leider nicht mehr). Ich hab's nur um Cookies erweitert, so das User eingeloggt bleiben können, wenn sie sich nicht explizit ausloggen. Und hierzu habe ich eine kleine Frage.
Ich speichere die Logindaten in Form von:
userid | Pass (gehasht) 1 | 4a4350df2403b94a13304ee88b861041
Beim Login versuche ich 2 Cookies zu setzen. Ein SESSION-Cookie und einen normalen. Beide erhalten den folgenden Wert:
// userid mit irgendwas multipliziert
$_SESSION['USER'] = '541 4a4350df2403b94a13304ee88b861041';
$_COOKIE['USER'] = '541 4a4350df2403b94a13304ee88b861041';
Und dann prüfe ich:
// Wenn Session, aber kein Cookie, Loginformular - damit ist schonmal Session Hijacking unterbunden
if $_SESSION['USER'] AND !$_COOKIE['USER']
exit()
// Wenn Session und Cookie vorhanden sind, Datenbankabfrage sparen, da die Sessiondaten auf dem Server liegen und vom Nutzer nicht geändert werden können
if $_SESSION['USER'] AND $_COOKIE['USER']
// Sessiondaten mit Cookiedaten vergleichen, wenn beide richtig, ist User eingeloggt
// Kann ich das so machen?
$_COOKIE['USER'][0] == $_SESSION['USER'][0]
$_COOKIE['USER'][1] == $_SESSION['USER'][1]
// Automatisches Login: Datenbank mit den Daten im Cookie abfragen, wenn keine Session vorhanden ist
if $_COOKIE['USER'] AND !$_SESSION['USER']
// wenn beide Daten im Cookie richtig sind, ist User authentifiziert
$_COOKIE['USER'][0] == $_USERINDB
$_COOKIE['USER'][1] == $_USERPASSINDB
Ich könnte das ganze jetzt um eine weitere Prüfung erweitern, in dem ich einfach alle vom User genutzten IPs beim Login checke, ob die aktuell nur mit Cookie aufrufende IP schon einmal genutzt wurde, wenn nicht, Login erzwingen. Ohne diese Prüfung könnte ein Hacker, wenn er die Userid und das gehashte Passwort richtig errät, das Profil kapern. Was aber ja auch schon schwierig genug sein dürfte.
Ich komme mit derzeit rund 1000 Zeilen Code aus (ohne IP-Check, mit wären's vllt. 30 - 40 mehr), da habe ich irgendwie bedenken, ob das wirklich so sicher sein kann (fühlt sich zumindest halbwegs sicher an, und etwas Weltbewegendes ist das ganze ja auch nicht unbedingt). Hier könnt ihr das ganze Live testen. Email ist nicht zwingend erforderlich, ihr könnt euch auch mit einzelnen Buchstaben registrieren.
Was passiert denn in grossen Frameworks, dass die teilweise tausende Zeilen Code benötigen? Selbst wenn ich jetzt noch eine Tabelle mit Userrechten laden würde, wären es lediglich ein paar Zeilen mehr. Was prüfen die noch alles, was wäre noch möglich oder ratsam?
Bis bald
Hosen sind Blau