Peter: utf-8 / db / magic_quotes - verständnis problem

Beitrag lesen

Ich hab es mittlerweile geschaft mein db-skript, auch unter typo3, auf utf-8 umszustellen.

Fein.

Ich hätte jetzt trotzdem erwartet, dass wenn ich jetzt strings mit anführungszeichen " oder ' in die datebank schreibe das mein query dadurch "zerstört" wird.

Das ist eine gute Erwartungshaltung.

OK, magic_quotes_gpc ist eingeschaltet (magic_quotes_runtime nicht ?!?!), und in der DB sind auch die einzelnen anführungszeichen sauber drin.

magic_quotes_gpc rettet dich halbwegs, aber nicht vollständig!

Wie muss ich mir das vorstellen:
ändert magic_quotes die quotes um für den query und werden die dann wieder "zurückgewandelt".
oder sorgt die Kodierung von utf-8 dafür, dass die string-quotes nicht als query-quotes interpretiert werden?

Escaping ist allgemein eine Technik, die bewirkt: "Hallo, System[1], hier ist ein Escaping-Zeichen, und das darauf folgende Zeichen nimmst du bitte exakt so, wie es da steht, und nicht mit der sonst üblichen Sonderbedeutung[2]".

[1] Unter System ist alles mögliche zu verstehen: Die Kommandozeile, HTML-Ausgabe im Browser, oder eben ein SQL-Interpreter.

[2] Sonderbedeutung ist auch erstmal alles mögliche. Typisch ist, wie z.B. in MySQL: Das Zeichen ' begrenzt einen String.

Das Escaping-Zeichen wird beim Parsen des Gesamtbefehls eliminiert. Denn das Parsen bewirkt, dass Befehle in Programmaktionen und Strings eben in Strings umgesetzt und verarbeitet werden. Ein String im Speicher hat aber außenherum keine Stringbegrenzer mehr, und in sich selbst keine Escaping-Zeichen. Also landet ein escapter String pur in der Datenbank, und kommt auch pur wieder heraus.

Konkret zu PHP: Magic_quotes_gpc wirkt auf alles, was per GET, POST oder COOKIES hereinkommt, dort aber leider nur auf einige wenige Zeichen (die, die typischerweise störend wirken in den meisten Anwendungen).

Dummerweise werden dadurch nicht alle Zeichen entschärft, die in MySQL schädlich wirken können. Deshalb ist es eine gute Idee, wenn du magic_quotes_gpc abschaltest (oder prüfst, ob es eingeschaltet ist, und nur dann stripslashes() auf den String anwendest) und das Escaping für die Datenbank immer mit mysql_real_escape_string() erledigst. Das ist absolut sicher. Außerdem berücksichtigt die MySQL-Funktion den von dir gewählten Zeichensatz - das magic_quotes_gpc nicht. Das macht bei UTF-8 keinen Unterschied im Ergebnis von mysql_real_escape_string(), aber bei anderen Codierungen, insbesondere asiatischen, sehr wohl.