Was habt ihr eigentlich alle mit euren Hashes? Passwort gehasht mit einem vom Admin beliebig erstelltem Salt in der Datenbank abspeichern und fertig is. Statt dem Speichern der User-ID, Login-ID und/oder gehashtem Passwort beim User im Cookie einfach Fake-IDs nutzen. Fertig ist der Kuchen. Es ist völlig unnötig echte Daten beim User im Cookie zu speichern, und unsicher dazu. Je anonymer die beim User gespeicherten Daten, desto besser!
@
carom
Speichern tu ich beim User folgendes:
- fixe UniqueID
- dynamische SessionID
Die beide IDs sind völlig frei erfundene, zwischen 32 und 1024 Zeichen lange Zeichenkette - wobei 32 eigentlich ausreichen, ich persönlich nehm 128. Ich nutz also keinen wirklich wichtigen, real existierenden Datensatz, sodass des praktisch unmöglich sein sollte einen ganz bestimmten Account anzugreifen. Nutzen tu ich diesen Code:
PHP:
function uniqueKey($length = "32")
{
$uniquekey ="";
$code = array_merge(range('0', '9'), range('a', 'z'), range('A', 'Z'));
mt_srand((double)microtime()*1000000);
if($length > 1024): $length = "1024";endif;
for ($i = 1; $i <= $length; $i++):
$swap = mt_rand(0,count($code)-1);
$uniquekey .= $code[$swap];
endfor;
return $uniquekey;
}
Wie gesagt, die dynamische Session ID nutzt dieselbe Funktion, jedoch mit dem Unterschied, dass diese ID bei jedem Seitenaufruf (oder alle x Sekunden) neu generiert wird. Sollte also jemand beispielsweise eine XSS-Attacke erfolgreich durchziehen und an die Cookies des Users kommen, dann weiß er immer noch nicht, welchen Account er hat. Das musser ausprobieren, und da genau einen Account zu treffen, der ein Adminaccount ist - wird schwer. Und wenn der Admin oder ein anderer User gerade online ist und surft (wovon in der Regel auszugehen ist), ist die Session, die der Angreifer gerade besitzt, potentiell eh schon wieder ungültig, da der echte User schon eine neue SessionID bekommen hat.
Gespeichert wird beides als Paar in der Datenbank, zusammen mit den Userdaten, die während der Session ständig gebraucht werden. Ein Sicherheitscheck prüft, ob die Keys der Länge n entsprechen und keine Sonderzeichen enthalten. Sind die Cookies OK, wird eine Anfrage an die DB geschickt, ob das Schlüsselpaar existiert. Wenn die Übereinstimmung nur partiell ist, wird der User ausgeloggt. Stimmen beide Keys, greift noch der Browsercheck (letzter Besuch des Users wird mit aktuellem Besuch verglichen) und, falls der Admin dies vorgegeben hat oder sich der User es selbst ausgesucht hat, noch der IP-Check.
Glaub man könnte da noch ein paar weitere Checks einbauen, vll mach ich des auch.
Fazit jedenfalls: Solang sich die Browserkennung nicht ändert und nicht die wesentlich sichere Session-IP-Bindung ausgewählt wurde, ist ein dauerhafter Login problemlos möglich - völlig ohne die hauseigene PHP-Sessionfunktion oder Speicherung von realen Daten beim User.
//Nachtrag:
Ich habe über diese Methode auch noch nie einen doppelten Key generiert, was bei MD5 ja beispielsweise durchaus passieren kann.