Moin!
Du hast ein Formular, in das der Benutzer etwas eingeben kann.
Was passiert mit Deinem Skript, wenn der Benutzer jetzt als NamenO'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 ist die nächste Frage: Warum ist das so, dass aus dem O'Brian aus dem Formulartextfeld ein O'Brian in der Datenbank wird?
Antwort: PHP hat die unangenehme Eigenschaft, eine Option zu besitzen (zum Glück abschaltbar), alle reinkommenden Formulardaten zu slashifizieren. magic_quotes_gpc genannt.
Irgendwer hat sich das mal ausgedacht, damit verhindert wird, dass User wie du sich ihre Datenbank schrotten, weil sie das SQL-Escaping weggelassen haben. Tolle Idee im Prinzip - wenn man die Daten denn immer in eine DB schreiben wollte. Will man Textdateien damit befüllen, stören die Slashes extrem. Außerdem decken die Slashes nicht zwingend alle Zeichen ab, auf die Datenbanken allergisch reagieren könnten, z.B. bei exotischeren Encodings.
Die Option ist also abschaltbar, es wird auch streng empfohlen, das zu tun, und künftige PHP-Versionen haben die Option gar nicht mehr. Dann endlich werden Scriptkiddies und Unwissende lernen müssen, was wir dir hier auch den Thread über beibringen wollen.
Zurück zur Ausgangslage: Angenommen, du hast einen String mit dem Namen O'Brian, den du in ein SQL-Statement einfügst. PHP hat dir diesmal KEIN Slash reingemogelt, dass du manuell (entweder vor der DB-Speicherung oder nach dem DB-Auslesen) entfernen mußt, weil diese Magic-Quotes-Option aus ist.
Wie sieht dein SQL-Statement aus, wenn du es einmal OHNE und einmal MIT mysql_real_escape_string() zusammenbastelst?
- Sven Rautenberg
"Love your nation - respect the others."