Zur Startseite Die Verwendung der Einstellung "register_globals=on" in der Konfigurationsdatei php.ini ist unter Entwicklern recht umstritten. Diese Einstellung bewirkt, dass PHP für jede übergebene Variable aus einem Formular oder einer Session eine globale Variable erzeugt. Ein Beispiel soll dies verdeutlichen:
Anmerkung: Die hier vorgestellten Beispiele sollen lediglich das Prinzip verdeutlichen. Bei einigen Einzelheiten würde man in einer endgültigen Anwendung möglicherweise anders vorgehen. Sie dienen hier lediglich als Beispiele, damit das Verfahren anschaulich erläutert werden kann. In meinen Online-Kursen wird selbstverständlich genauer auf Einzelheiten eingegangen.
Advertisement/Werbung
Hier wird ein Feld mit dem Namen "username" und ein Passwortfeld mit dem Namen "pass" per Formular-POST übergeben. Nach dem Abschicken des Formulars, werden von PHP automatisch die globalen Variablen $username und $pass erzeugt, die dann die Werte aus dem Formular enthalten.
Diese Eigenschaft von PHP ist recht praktisch und gerade für Einsteiger leicht zu verstehen. Daher sind im Internet auch die meisten PHP-Skripte auf diese Eigenschaft angewiesen, denn sie verwenden solche automatischen globalen Variablen.
Das Einschalten von "register_globals" hat jedoch auch einen Sicherheitsaspekt: Es können nämlich sehr leicht Variablen manipuliert werden. So kann beispielsweise durch die Eingabe folgender URL das Formular ausgetrickst werden:
http://IhreDomain.de/register_globals.php?username=admin&pass=geheim
Auch hier werden die Variablen $username und $pass im Skript als globale Variablen gesetzt, obwohl die Daten nicht durch das Formular versendet wurden. In diesem Beispiel ist das Sicherheitsproblem noch nicht wirklich gravierend, denn der User gibt ja die Daten selbst in das Formular ein. Kritischer ist das schon die Manipulation von hidden-Feldern im Formular, die ebenso über die URL leicht verändert werden können.
Advertisement/Werbung
Allerdings sollten sicherheitsrelevante Daten (wie z.B. Artikelpreise) sowieso niemals über hidden-Felder übertragen werden. Für solche Daten sollte eine PHP-Session benutzt werden. Gefährlich wird register_globals jedoch, weil sich auch Variablen aus der Session so manipulieren lassen. Daher wird von vielen Entwicklern gefordert, die Einstellung "register_globals=off" zu verwenden, um dieses Problem von vornherein auszuschalten.
Die wenigsten Provider unterstützten jedoch diese Einstellung, ganz einfach weil sonst die meisten existierenden Skripte nicht funktionieren. Der Provider würde sich vor Beschwerden seiner Kunden nicht mehr retten können. Daher sind praktisch alle Internetpräsenzen mit der PHP-Einstellung "register_globals=on" ausgestattet.
Aber auch mit dieser Einstellung kann man etwas für die Sicherheit der eigenen Anwendung tun: Schreiben Sie das Skript so, als ob register_globals ausgeschaltet wäre. Wenn Sie die Skripte auf dem eigenen Webserver (zuhause oder auf einem Online-Mietserver) testen, suchen Sie die Zeile mit "register_globals" in Ihrer php.ini und stellen diese dann auf:
register_globals=off
Das oben beschriebene Skript wird dann nicht mehr funktionieren. Sie müssen es folgendermaßen ändern:
<form action="<?php echo $PHP_SELF ?>" method="POST"> User: <input type="text" name="username"><br> Passwort: <input type="password" name="pass"><br> <input type="submit" name="submit" value="login"> </form> <form action="<?php echo $GLOBALS['PHP_SELF'] ?>" method="POST"> User: <input type="text" name="username"><br> Passwort: <input type="password" name="pass"><br> <input type="submit" name="submit" value="login"> </form> <?php echo "username: ".$_POST['username']."<br>"; echo "passwort: ".$_POST['pass']."<br>"; ?>
Beachten Sie dabei: Auch die globale Variable $PHP_SELF existiert nun nicht mehr. Sie müssen solche globalen Variablen immer mit der Array-Variable $GLOBALS['variablenname'] ansprechen.
Die vom Formular per POST übergebenen Variablen erhalten Sie nun in der Array-Variable $_POST['variablenname']. Diese Variable $_POST existiert seit der PHP-Version 4.1.0, die wohl inzwischen bei jedem seriösen Provider mindestens installiert sein sollte.
Wenn Sie nun die gleichen Variablen in der URL eingeben, werden die Inhalte von $_POST dadurch nicht überschrieben. Statt dessen werden Parameter in der URL über die Array-Variable $_GET übergeben. Für Sessions gibt es die Array-Variable $_SESSION, die alle registrierten Variablen der aktuellen PHP-Session enthält.
Wenn Sie ausschließlich über diese Variablen auf Datenfelder zugreifen, ist eine Manipulation über die URL ausgeschlossen, auch wenn "register_globals=on" eingestellt ist.
Noch ein Tipp:
Um Array-Variablen im Skript komfortabel auszugeben, können Sie folgende drei Zeilen verwenden:
echo "<pre>"; print_r($_POST); echo "</pre>";
Wobei Sie hier $_POST auch durch jede andere der Array-Variablen ersetzen können. Die umfangreichste Ausgabe erhalten Sie mit $GLOBALS. Die PHP-Funktion "print_r()" erzeugt eine lesbare Ausgabe (print_r bedeutet "print readable") der übergebenen Variable. Ist die Variable ein Array, werden alle Elemente strukturiert ausgegeben. Damit man die Struktur (Zeilenschaltungen und Einrückungen) auch auf der HTML-Seite gut sehen kann, muss vorher das HTML-Tag <pre> ausgegeben werden, sonst wird alles in einer Zeile hintereinander ausgegeben.
Hinweis: Diesen Text und die enthaltenen Beispielprogramme und Skripte dürfen Sie zum Erlernen der einzelnen Techniken und auch als Grundlage für Ihre eigenen Projekte auf eigene Gefahr kostenlos nutzen.
Bitte denken Sie daran, dass alle Texte und Quellcodes trotzdem urheberrechtlich geschützt sind. Eine direkte Weitergabe ist nur nach ausdrücklicher schriftlicher Genehmigung gestattet.