Moin!
- Zur Zeit generiere ich ein SQL-Statement, dass Inhalte in die
DB schreibt in etwa so:$content = $_POST['content'];
if (!get_magic_quotes_gpc())
$content = addslashes($content);
$sql_stament = '
UPDATEtable
SETcontent
= "'.$content.'"';... ich erzwinge m.E. also Slashes.
Diese Vorgehensweise ist unsauber. Die einzige korrekte Funktion zum Escapen für MySQL ist mysql_real_escape_string(). Oder lieber (und wenn verfügbar) mysqli_real_escape_string() (wobei die objektorientierte Nutzung auch die kürzere Schreibweise $x->escape_string() erlaubt).
Mit anderen Worten: Deine Logik müßte im Prinzip komplett umgedreht werden: Wenn magic_quotes_gpc aktiviert ist (eine schlechte Sache), ist stripslashes() auf die Eingabedaten anzuwenden, ansonsten passiert nichts.
Und dann wird der String zur Verwendung im SQL-Query mit mysql_real_escape_string() entschärft.
- Wenn ich mir $sql_stament auch der Seite ausgeben lasse, sieht
das so aus:UPDATE
table
SET
content
= "<div class="cross_image">
<h1>TEST</h1>";... und habe den Eindruck 1) funktioniert.
Ja, an der optischen Erscheinungsweise dieses Schrittes wird sich nichts ändern, wenn du die Änderungen unter 1) einarbeitest - nicht in diesem konkreten Spezialfall jedenfalls.
- Wenn ich dann in meinem phpmyadmin dann
content
als SQL
exportiere, sieht das so aus:INSERT INTO
tabke
VALUES ('<div class="cross_image">\r\n<h1>TEST</h1>');... und da sind die Slashes verschwunden.
Das ist vollkommen normal, das muß so sein. Escaping ist für einen Verarbeitungsschritt zuständig, damit Nutzdaten von Steuerdaten getrennt werden können. Am Ende bleiben - und das ist die Absicht dahinter - nur wieder die originalen Nutzdaten übrig.
Dasselbe hast du ja auch, wenn du einen String mit Anführungszeichen definierst:
$str = "Hallo \"Welt\"";
Die doppelten Anführungszeichen außenrum sind "Steuerdaten", sie steuern, wo PHP Anfang und Ende des Strings erkennt. Die Anführungszeichen innen sind Nutzdaten, und du mußt den Backslash davor schreiben, damit diese sich von den Steuerdaten unterscheiden - die Variable enthält aber nach dieser Programmzeile nur wieder die original gemeinten Anführungszeichen ohne Backslashes.
- Sven Rautenberg
"Love your nation - respect the others."