Moin!
Ich habe eine PHP Seite mit einem User Login Bereich.
Der User gibt seinen Namen und Passwort ein und wird dann auf die Hauptseite geleitet.
Das Passwort ist als Spalte "pwd" mit Varchar(250) in der MySQL Tabelle "userdata" gespeichert. Als Kollation habe ich "latin1_german1_ci" verwendet.
Wenn der User sich zum ersten mal registriert wird das Passwort mit
"AES_ENCRYPT('$password',@pwd_key) in der Spalte "pwd" gespeichert.
AES_ENCRYPT liefert dir einen Binärwert, keinen String im Datenbanksinn. Also ist es falsch, diesen Wert in einer VARCHAR-Spalte abzuspeichern und dafür etwas anderes als eine Binärcollation zu benutzen, weil Werte auftreten können, die keinem codierbaren Zeichen entsprechen.
Aber abgesehen davon: Warum AES_ENCRYPT? Damit lassen sich die Passwörter alle wiederherstellen. Das ist genauso schlecht, als wären sie direkt im Klartext gespeichert. Nutze MD5() oder SHA1(), nur damit ist der String nicht wiederherstellbar - und du erhälst außerdem eine deutlich ungefährlichere und immer gleichlange Zeichenkette, die auch in VARCHAR-Spalten gespeichert werden darf.
Und außerdem: Hast du das Passwort auch vernünftig escaped? mysql_real_escape_string() benutzt?
Es können also auch Sonderzeichen und nicht darstellbare Zeichen drin stehen.
Etwa: TB.·þ2d]bæø (in Echt sind hier noch Ascii Zeichen die ich hier nicht darstellen kann!)
Daran, dass das Forum meckert, siehst du, dass du es mit Binärwerten zu tun hast, die nicht mit normaler Stringverarbeitung benutzt werden können.
Das Problem tritt dann auf, wenn man mit PhpMyAdmin die MySQL Tabelle "userdata" öffnet. Also z.b. auf "Browse" ("Anzeigen") klickt und dann auf "edit" klickt. Obwohl ich nichts an den Daten ändere, wird das Passwort in einem anderen "Format" abgelegt.
Nein, PHPMyAdmin tut sein Bestes, aber da du die Datenbank falsch konfiguriert hast, gehen dir eben Zeichen verloren.
PhpMyAdmin zeigt dann auch folgenden Update Befehl an:
UPDATEtestdb
.userdata
SETpwd
= 'TB.·þ2d]bæø' WHEREuserdata
.UserID
=3 LIMIT 1 ;
Macht man da Gleiche ein zweites mal, wird kein Update gemacht.
Beim zweiten Mal sind eben alle "bösen" Zeichen rausgefiltert.
Dann kann sich der User anschließend nicht mehr einloggen.
Schon nach dem ersten Update nicht mehr. :)
- Sven Rautenberg
"Love your nation - respect the others."