dedlfix: Login funktioniert mit MD5-Verschlüsseluing nicht mehr

Beitrag lesen

echo $begrüßung;

Du hast ein Formular, in das der Benutzer etwas eingeben kann.
Was passiert mit Deinem Skript, wenn der Benutzer jetzt als Namen
   O'Brian
eingibt? Gern auch als Passwort. Was schickt Dein Skript an MySQL?
Es schickt O'Brian an MySQL, dort wird es "behandelt" und als O'Brian eingetragen. So steht es auch drin, wenn ich es mir über phpMyAdmin ansehe. Bei der Ausgabe in meinem Script wird der Name "gestripslashed" und ich lese O'Brian.

Dann hat dir anscheinend ein Feature von PHP einen Streich gespielt: Magic Quotes. Seine Aufgabe ist es, ebensolche SQL-Injektion zu verhindern, indem es die Maskierungen vornimmt. Doch dieses Feature wirkt auf jegliche Eingabedaten. Und von denen ist beim Scriptstart noch gar nicht bekannt, ob sie in einem SQL-Statement zu stehen kommen oder in einem ganz anderen Kontext mit komplett anderen Regeln ausgegeben werden. Nicht nur weil es fehlplatziert ist, ist es nicht mehr länger geduldet und fällt ab PHP6 weg.

Du wendest dann mysql_real_escape_string() auf die bereits behandelten Daten an, und maskierst ungefähr doppelt. "Ungefähr" deshalb, weil Magic Quotes weniger Zeichen behandelt als mysql_real_escape_string(). Ersteres ist sehr allgemein gehalten, letzeres auf MySQL-Statements spezialisiert. Durch die doppelte Behandlung hast du nun unnötige Zeichen in der Datenbank stehen. Die eine Maskierung wird als Transportsicherung beim Auswerten des Statements wieder entfernt, die andere ist zu nichts nütze außer zum Verfälschen von Stringfunktionsergebnissen, die MySQL gegebenenfalls auf die Daten ausführen soll. Z.B. ist die Länge von foo'bar eine andere als die von foo'bar. foo'bar passt auch nicht in ein Feld für 7 Zeichen.

Es schickt O'Brian an MySQL, dort wird es "behandelt" und als O'Brian eingetragen.

Das ist nicht richtig. Mach Kontrollausgaben der Werte (am besten mit var_dump(), denn das gibt dir unter anderem auch die Anzahl der Zeichen eines Strings aus), so wie sie dein Script erreichen, und so wie das fertige SQL-Statement aussieht, bevor du es mysql_query() übergibst. MySQL "behandelt", ja, aber nicht so wie du dir das vorstellst. Es entfernt die Transportsicherung und reduziert deine doppelte Maskierung zu einer einfachen.

So steht es auch drin, wenn ich es mir über phpMyAdmin ansehe.

Du siehst die eine übrig gebliebene und überflüssige Maskierung.

Bei der Ausgabe in meinem Script wird der Name "gestripslashed" und ich lese O'Brian.

Das kannst du dir sparen, wenn du

  • das Feature Magic Quotes deaktivierst oder seine Auswirkungen gleich am Scriptanfang rückgängig machst,
  • die Maskierung, so wie du es ja schon teilweise angefangen hast, auf jegliche Daten anwendest, die in ein SQL-Statement eingefügt werden.

Somit hast du nur eine Maskierung für den Transport der Daten in einem SQL-Statement zum MySQL-Server. Da die Daten auf dem Rückweg aus dem MySQL-Server separat und nicht gemixt mit Anweisungsteilen transportiert werden, ist eine Transportsicherung nicht notwendig. Du bekommst also die Daten in Rohform von den mysql_fetch_*()-Funktionen geliefert.

echo "$verabschiedung $name";