Datum: 08.12.2008
, Kategorie:
PHP
An den Superglobals von PHP sollte man besser nicht herumfummeln. Stattdessen sollte man Kopien von $_POST, $_GET und $_COOKIE erstellen und diese dann ändern. Wer das bisher noch nicht beherzigt hat, dem sei folgendes Beispiel vor Augen geführt.
Angenommen wir möchten uns nicht darauf verlassen, dass magic_quotes_gpc in der php.ini aktiviert ist. Stattdessen wollen wir manuell sicherstellen, dass alle Elemente in den Arrays mit addslashes() behandelt werden. Dabei hilft folgende Funktion, die wir per array_walk() aufrufen. Die Funktion hangelt sich rekursiv durch ein Array und wendet addslashes() auf jedes Element in diesem Array an.
<?php
function escape_input(&$value)
{
if (is_array($value)) {
array_walk($value, 'escape_input');
return;
}
if (ini_get('magic_quotes_gpc')) {
$value = stripslashes($value);
}
$value = addslashes($value);
}
Nehmen wir weiter an, der Wert von magic_quotes_gpc in der php.ini ist false. Eingaben, die beispielsweise ein Hochkomma oder Anführungsstriche beinhalteten, werden in diesem Fall nicht automatisch mit einem Backslash versehen (escaped). Würden wir jetzt obige Funktion direkt auf $_POST anwenden, veränderten wir diese Superglobale, ohne dass andere Komponenten dies mitbekommen.
Die Pear-Klasse QuickForm ist so ein nichtsahnender Kandidat. Bevor QuickForm POST-Daten zurück in die Formularfelder schreibt, überprüft die Klasse, ob magic_quotes_gpc aktiviert ist. Ist dies der Fall, werden eventuell vorhandene Backslashes vorher entfernt, andernfalls werden die Daten unverändert übernommen. In einer Situation, in der magic_quotes_gpc abgeschaltet ist und wir $_POST nachträglich mit Backslashes versehen haben, tauchen diese Backslashes in den Formularfeldern auf.
Umgehen lässt sich dieses Problem nur, indem wir Änderungen ausschließlich an Kopien von $_POST etc. ausführen und diese Kopien in unseren Scripten verwenden.