Tom: Magic Quotes

Beitrag lesen

Hallo Obelix,

das ist einfach relativ schnell erklärt, was dort passieren soll. Das Script hat meine Meinung noch einen Denkfehler.

Magic-Quotes_GPC steht für MQ GET, POST, COOKIE

Das bedeutet, dass alle Daten, die über $_GET, $_POST oder $_COOKIE dem Script zur Verfügung gestellt werden, mit dem Backslash maskiert werden. Die behandelten Zeichen sind der einfache und der doppelte Anführungsstrich (' und "), der Rückstrich () selbst sowie NUL (das Null-Byte).

Henryk stellt als erste mit Hilfe der Funktion

get_magic_quotes_gpc() fest, ob die entsprechende INI-Variable gestzt ist. Die Spezialfunktion gibt immer Antwort, egal, ob der User auf die INI-Datei zugriff hat oder nicht (-> ini_get("magic_quotes_gpc") würde dann das gleiche Ergebnis liefern).

Wenn MQ_GPC nicht eingeschaltet ist, dann sollte er den sonst automatisch durchgeführten Vorgang "zu Fuß" nachholen für jedes der drei Arrays. Und das genau tut er nicht. Er unterscheidet noch nach der Übertragungsmethode. Dabei hat er aber übersehen, dass PHP auch bei der Übertragungsmethode POST in $_GET[] Werte zur Verfügung stellen kann. Die Verzweigung (if ..) sollte man also wieder rausbauen.

Die Foreach()-Funktion ist etwas unvollständig programmiert, deshalb muss man for der Anwendung immer erst Fragen, ob das Argument tatsächlich ein Array ist. Da aber jedes Array auch wieder Unterarrays enthalten kann, wird rekursiv gearbeitet.

Na, und mehr passiert hier eigentlich nicht.

Wenn Du nun mit mysql_escape_string() arbeiten willst, musst Du die Logik genau umdrehen. Du musst dann nach der Datenübernahme fragen, ob MQ_GPC eingeschaltet war. Wenn JA, dann musst Du das Verfahren von Henryk mit der Funktion stripslashes() anwenden, um die Maskierungen wieder zu entfernen.

Dann solltest Du alle Verarbeitungen mit den Daten durchführen und am Ende alle Daten, bevor sie an die DB übergeben werden, mit mysql_escape_string() behandeln.

Das geht dann auch seriell (also nicht rekursiv), da ja an die DB nur Skalare (keine Arrays) übergeben werden dürfen. Also reicht ein einfaches foreach() für alle Werte deines SpeicherBuffers.

I hoaff, Du hoast mi nun :-))

Liebe Grüße

Tom