Register globals

Aus php bar
Wechseln zu: Navigation, Suche

Was ist 'register_globals'?

register_globals ist eine Einstellung in der PHP Konfigurationsdatei. Ist diese Option aktiviert, werden die in variables_order angegebenen Variablen (GET, POST, COOKIE, ENV und SERVER - kurz EGPCS oder GPC) automatisch importiert, also als Variablen im globalen Namensraum registriert. Dadurch kann auf die Parameter zugegriffen werden, wie auf globale Variablen.

Ab PHP 4.2.0 wurde die Option aus Sicherheitsgründen standardmäßig deaktiviert. In diesem Fall kann auf die entsprechenden Werte nur über die superglobalen Arrays zugegriffen werden. In PHP 6 soll die Option abgeschafft werden.

Beispiel register_globals = on:

1 // index.php?variable=wert
2 echo $variable;
3 echo $_REQUEST['variable'];

Ausgabe:

wert
wert

Beispiel register_globals = off:

1 // index.php?variable=wert
2 echo $variable;
3 echo $_REQUEST['variable'];

Ausgabe:

 // Notice: undefined variable $variable on line 2
wert

Wieso ist 'register_globals = on' unsicher?

register_globals auf on selber ist eigentlich nicht unsicher, es lässt lediglich Sicherheitslücken bei fehlerhafter Programmierung zu. Ist register_globals eingeschaltet und vergisst der Programmierer Variablen vor ihrer Verwendung zu initialisieren kann ein Angreifer den Programmablauf von außen beeinflussen.

Beispiel für unsicheren Code::

1 //datei login.php
2 
3 if ( $username ) {
4     $login_ok = true;
5 }
6 
7 if ($login_ok) {
8     //Zugriff auf geheime Daten gestattet!
9 }


Um bei diesem Beispiel Zugriff auf die "geheimen Daten" zu bekommen, braucht man lediglich die URL in der Adressleiste des Browsers zu verändern:
login.php?login_ok=1
Jetzt wird die Variable aus dem $_GET Array direkt im Script verfügbar gemacht, mit dem Wert 1 versehen und schon haben wir Zugriff auf die "geheimen Daten".

Wieso gibt es dann noch register_globals?

In erster Linie gibt es die Option noch um Abwärtskompatibilität mit älteren Scripten zu gewährleisten. Aber prinzipiell gibt es register_globals, weil Programmierer ziemlich faul sind und sich so etwas Schreibarbeit ersparen wollten. Es ist aber dringend davon abzuraten, register_globals in einer Produktivumgebung zu aktivieren. Ab PHP Version 6.0 wird register_globals nicht mehr unterstützt.

Wie kann ich register_globals deaktivieren?

php.ini

Wenn Sie selbst auf die php.ini Zugriff haben, suchen Sie einfach in der Datei nach dem Eintrag register_globals und tragen hinter dem = ein off ein.

; You should do your best to write your scripts so that they do not require
; register_globals to be on;  Using form variables as globals can easily lead
; to possible security problems, if the code is not very well thought of.
register_globals = off

Sollten Sie keinen Zugriff haben, sollten Sie Ihren Webmaster bitten, die Einstellung zu deaktivieren.

In einigen Fällen reicht es auch, lediglich eine Textdatei mit dem Inhalt register_globals=off unter dem Namen php.ini direkt im Webverzeichnis abzuspeichern!

.htaccess

Wenn Ihr Webmaster die Einstellung nicht deaktivieren möchte oder Sie nur bestimmte Verzeichnisse ändern wollen, ist es möglich dies mit einer .htaccess Datei zu machen. Vorausgesetzt, der Webserver ist ein Apache und erlaubt .htaccess Dateien.

php_flag register_globals off

Wie komme ich jetzt an meine Variablen?

Lesen sie dazu etwas über Superglobale Arrays.

Mein Provider hat register_globals deaktiviert. Kann ich mein Script noch retten?

Ja. Als Übergangslösung kann man import_request_variables() verwenden um die Variablen entsprechen register_globals verfügbar zu machen. Längerfristig sollte man aber die Anwendung auf register_globals = off umschreiben.

Links

http://www.php.net/manual/en/ini.sect.data-handling.php#ini.register-globals