SELFPHP

SELFPHP-Druckversion
Original Adresse dieser Seite:
http://www.selfphp.de/praxisbuch/praxisbuchseite.php?site=105&group=22
© 2001-2017 E-Mail SELFPHP OHG, info@selfphp.de
© 2005-2017 E-Mail PHP5 Praxisbuch - Matthias Kannengiesser, m.kannengiesser@selfphp.de


Einsatz von register_globals


Welche PHP-Version verwenden Sie? Finden Sie es heraus! Prüfen Sie bei dieser Gelegenheit, wie die Variable register_globals bei Ihnen eingestellt ist. Dies gelingt mithilfe des folgenden PHP-Skripts:

<?
phpinfo();
?>

Im Browserfenster wird eine umfangreiche Übersichtseite erscheinen. Scrollen Sie in dieser Datei ein Stück nach unten und überprüfen Sie die Einstellung der Variablen register_globals.

Die Einstellung der Variablen können Sie in der Konfigurationsdatei php.ini jederzeit selbst vornehmen. Der Eintrag in der Konfigurationsdatei stellt sich wie folgt dar:

register_globals = On

Seit der PHP-Version 4.2 wird diese Variable jedoch standardmäßig auf Off gesetzt.

register_globals = Off

Sie merken es vor allem dann, wenn Sie Ihren eigenen Webserver betreiben und updaten. Schalten Sie daher bei Problemen mit Ihren PHP-Skripts (vorerst) zurück auf On. Nach einem Neustart des Webservers stehen die geänderten Einstellungen zur Verfügung. Die meisten Provider mit PHP-Unterstützung haben in der Regel noch nicht auf register_globals = Off umgeschaltet. Zu groß wäre wohl der Aufschrei vieler Kunden. Schließlich bedeutete diese Maßnahme, dass viele Skripts auf einen Schlag nicht mehr funktionierten. Vor allem bei umfangreichen Projekten wäre die Umstellung mit einem erheblichen Aufwand verbunden. Denn hinter dieser Änderung stecken z. B. die Informationen aus »GET« und »POST«, »COOKIES« und »SERVER« – also praktisch der gesamte Bereich externer Variablenquellen. Und diese Werte stehen nach der Änderung der Einstellung für register_globals nun nicht mehr zur Verfügung.

Die Informationen aus dieser Quelle können nun nicht mehr so einfach per $Variablennamen ausgelesen werden. Am Beispiel einer Formularauswertung will ich Ihnen dies verdeutlichen. Bisher war PHP wirklich einfach gestrickt. Der Name eines Formularfelds wurde automatisch zur Variablen.

<input type="text" name="telefon">

Im auswertenden PHP-Skript wurde folgendermaßen auf den Inhalt des Formularfelds zugegriffen:

$telefon

Dabei spielte es übrigens keine Rolle, ob das Formular per

method = "post"

oder

methode = "get"

abgeschickt wurde. Selbst die Werte von Cookies konnte man anhand ihres Namens ermitteln. Diese Schreibweise stellt sich als recht bequem dar, aber auch äußerst problematisch, wenn es um Eindeutigkeit und Sicherheit geht.


Probleme der Schreibweise – Eindeutigkeit

Es kann durchaus zu Verwechslungen kommen, vor allem wenn Sie nicht zu den diszipliniertesten Entwicklern gehören. Sie erzeugen etwa ein Formularfeld, das name heißt. Zufälligerweise steckt auch ein gleichnamiges Cookie in Ihrem Quellcode. Dann haben Sie ein Problem, denn sowohl der Inhalt des Formularfelds als auch der Wert des Cookies stehen nun über $name zur Verfügung. Diese Schwierigkeiten könnte man mit einer konsequenten Variablenbennenung vermeiden. Beginnen Sie Cookie-Variablen grundsätzlich mit einem kleinen c und Formular-Variablen mit einem kleinen f.


Probleme der Schreibweise – Sicherheit

Kommen wir nun zum Sicherheitsproblem. Es gibt bei schlampig programmiertem Code viele Angriffsmöglichkeiten für potenzielle Hacker. Schauen Sie sich einmal folgenden Teil eines PHP-Skripts an:

if ($pw=="g1882m") {
$login = true;
}
{PSP}Hier wird mit der Signalvariablen $login gearbeitet. Nur bei Kenntnis des richtigen Passworts soll diese auf true gesetzt werden. Dummerweise wurde diese Variable am Anfang des Beispiels nicht mit false initialisiert. Kein großes Problem, denkt man – bei dem recht komplexen Passwort. Im Gegenteil! Auf diese Weise kann ein Angreifer nun ganz einfach ohne Kenntnis des Passworts in den geschützten Bereich gelangen. Wie? Er muss an die URL lediglich

?login=true oder ?login=1
localhost/beispiel.php?login=true

anhängen. Schon wird die Variable $login auf true gesetzt und der Zugang ist auch ohne Passwortkenntnis möglich. Dies wiederum stellt ein riesiges Sicherheitsloch dar.


Neue Schreibweise = mehr Eindeutigkeit und Sicherheit

Dieses Problem hat das PHP-Entwicklerteam erkannt und spätestens mit Einführung von PHP 4.1 elegant behoben. Sämtliche über method = "post" versendeten Formulardaten sind im neuen Array $_POST gespeichert, die per method = "get" erhältlichen Daten dagegen im neuen Array $_GET. Dazu gehören auch die an die URL angehängten Parameter. Es handelt sich bei $_POST und $_GET übrigens um assoziative Arrays. Der Schlüssel wird aus dem Namen des entsprechenden Formularfelds bzw. der entsprechenden Cookie-Variablen gebildet. Wenn der Wert des URL-Anhangs ?login=true erfasst werden soll, gelingt dies über $_GET["login"]. Bei konsequent abgeschalteten register_globals ist eine Verwechslung mit einer Variablen $login nun nicht mehr möglich.

Um diese alten Möglichkeiten vollkommen zu unterbinden, wird seit PHP-Version 4.2 daher auch register_globals = Off als Standard gesetzt. Diese Einstellung bietet optimale Sicherheit und ist daher für zukünftige Projekte dringend zu empfehlen.


Erweiterungen

Ich will Ihnen natürlich nicht vorenthalten, dass seit Version 4.1 neben $_POST und $_GET folgende weitere assoziative Arrays eingeführt wurden:
$_COOKIE
Dieses Array enthält sämtliche Cookie-Variablen. Mit $_COOKIE["besucher"] würden Sie den Wert des Cookies besucher ermitteln.
$_REQUEST
Dieses Array nimmt eine Sonderposition ein. Es enthält sämtliche Werte aus $_POST, $_GET und $_COOKIE. Ich empfehle, den Einsatz von $_REQUEST zu vermeiden, da es die Bemühungen um mehr Eindeutigkeit zunichte macht. Mit $_REQUEST["login"] können Sie z. B. sowohl auf ein Formularfeld namens login als auch auf das gleichnamige Cookie zurückgreifen. Mit den neuen Variablen entfallen übrigens die bis Version 4.1 gültigen Arrays:

Dies bedeutet wiederum eine Vereinfachung der Schreibweise.

Zusätzlich werden die neuen Arrayvariablen $_SERVER, $_ENV und $_SESSION zur Verfügung gestellt. $_ENV ist für die Umgebungsvariablen und $_SESSION für das Session-Management verantwortlich. Am interessantesten ist sicher die erstgenannte Variable $_SERVER. Sie enthält sämtliche Servervariablen, also die Variablen, die der Webserver übergibt.

Wenn man früher Pfad und Dateinamen ermitteln wollte, schrieb man $PHP_SELF. Heute wird via $_SERVER["PHP_SELF"] auf diesen Wert zugegriffen.


Tipps zur neuen Schreibweise

Auf den ersten Blick wird die Schreibweise durch die neue Array-Syntax komplizierter. So konnte ein Formularfeld im PHP-Skript nach der alten Schreibweise unkompliziert ausgelesen und weiterverarbeitet werden.

<input type="text" name="telefon">

Auslesen und Verarbeiten:{PSP}
echo "Sie haben folgende Nummer $telefon";

Eine Verkettung des umgebenden Strings mit der Variablen ist dabei nicht nötig. Nach der neuen Syntax geht das offenbar nicht mehr so einfach. Versuchen Sie dies noch einmal:

echo "Sie haben folgende Nummer $_POST['telefon']";

Die Ausgabe enthält nicht den Inhalt der Variablen, sondern es wird der String $_POST['telefon'] ausgegeben. Dabei nützt es auch nichts, dass Sie die Regeln beherzigen, bei der Verschachtelung von Anführungszeichen nur ungleiche Anführungszeichen zu verwenden. Es wurden für den Arrayschlüssel die einfachen Anführungszeichen und für den gesamten String die doppelten Anführungszeichen verwendet. Doch das hilft alles nichts. Es muss verkettet werden:

echo "Sie haben folgende Nummer" . $_POST['telefon'];

Vor allem bei umfangreichen Auswertungen wird es dadurch schnell unübersichtlich und kompliziert. Doch folgender Trick könnte Ihnen bei Ihrer Arbeit behilflich sein.

Lassen Sie die normalerweise üblichen Anführungszeichen um den Arrayschlüssel herum einfach weg:

echo "Sie haben folgende Nummer $_POST[telefon]";

Diese anführungszeichenfreie Schreibweise ist immer dann möglich, wenn die Arrayvariable selbst innerhalb eines Anführungszeichenpaares steht. In allen anderen Fällen sollten Sie den Schlüssel je nach Bedarf stets mit einfachen oder doppelten Anführungszeichen versehen.