php.de

Zurück   php.de > PHP.de Wiki

Kategorien

register_globals (php.ini-Direktive)

Aus PHP.de Wiki

Wechseln zu:Navigation, Suche

Die Direktive register_globals in der php.ini bewirkt, dass alle Request-Parameter unter ihrem Namen als Variable im globalen Scope verfügbar sind. Wird einer PHP-Datei beispielsweise der GET-Parameter foo=bar übergeben, so ist bei aktiver register_globals Einstellung der Wert bar im Skript direkt unter dem Variablennamen $foo abrufbar.

Da register_globals in frühen PHP-Versionen Standard war, setzen viele alte (veraltete) Scripte noch auf dieses Verhalten. In neuen Serverumgebungen funktionieren diese Scripte jedoch out-of-the-box nicht mehr, da register_globals in aktuellen PHP-Versionen deaktiviert ist und damit die betreffenden Variablen nicht mehr automatisch im Scope deklariert werden.

Inhaltsverzeichnis

Problematik

Die Verwendung von Variablen, die durch register_globals automatisch initialisiert wurden, führt zu verschiedenen Problemen, weshalb diese Option zunehmend per Ini-Voreinstellung abgeschaltet ist und in zukünftigen PHP Versionen ganz entfallen wird. Nachfolgend werden die Problematiken aufgeführt.


Bild:Icon-warning.png

Achtung:
register_globals ist seit PHP 4.2.0 standardmäßig deaktiviert und wird in PHP 6.0.0 endgültig entfernt.
Es wird dringend empfohlen, stattdessen SuperGlobals zu verwenden!


Verfügbarkeit

Alleine die Möglichkeit, register_globals ein- und auzuschalten führt zum ersten Problem. Ist eine Software so programmiert, dass sie automatisch initialisierte Variablen benutzt, funktioniert sie nicht mehr auf Systemen, die register_globals deaktiviert haben. Gerade auf Serverbereichen, die nicht selbst administrierbar sind, ergibt sich als einzige Möglichkeit eine Änderung der genutzen Software. Die alternative Verwendung der superglobalen Parameterarrays funktioniert dagegen sowohl mit an- als auch abgeschalteter Variablenregistrierung.


Fremdinitialiserung

Betrachtet man das obige Beispiel lässt sich erahnen, dass aus dieser automatischen Variablengenerierung immense Probleme entstehen können, die nicht zuletzt auch die Sicherheit des Skripts beeinträchtigen. Der Programmierer hat durch register_globals keine Kontrolle mehr über die verfügbaren Variablen.

Ein Zugriff auf Variablen, denen in einem Script bisher kein Wert zugewiesen wurde, gibt NULL (und eine Notice) zurück. Verläßt sich der Programmierer unbewußt auf dieses Verhalten, entsteht ein Unsicherheitsfaktor: Wird eine Variable nicht korrekt initialisiert, kann es leicht passieren, dass sie durch eine Übergabe "von außen" (also bspw. über einen GET Parameter in der Browseradresszeile) und das Verhalten von register_globals mit einem Wert vorbelegt wird.

Ein Beispiel, um diese Sicherheitslücke du demonstrieren:

if (isset($param)) {
    $passSecondIf = true;
}
 
if (isset($passSecondIf) && true == $passSecondIf) {
    // do something important...
}

Das Script ist so konzipiert, dass der GPC-Parameter $param abgefragt wird. Ist dieser gesetzt, so wird die Variable $passSeconfIf deklariert und initialisiert, welche in der zweiten if-Abfrage benutzt wird. Da diese Variable aber nicht sicher initialisiert wurde, ist es einfach möglich, sie von außen zu manipulieren. Wird z.B. der GET- oder POST-Parameter passSecondIf=abc übergeben, so ist es möglich, das zweite if-Statement einzuleiten, ohne dass die Prüfung vorher erfolgreich sein muss.

Um diese Sicherheitslücke zu umgehen, sollten Variablen zuvor fest und ohne umschließende Bedingung initialisiert werden:

$passSecondIf = false;
 
if (isset($param)) {
    $passSecondIf = true;
}
 
if (true == $passSecondIf) {
    // do something important...
}

Somit ist es nicht mehr möglich, $passSecondIf zu manipulieren. Dass das Beispiel ohne register_globals trotzdem nicht wie gewünscht funktionieren würde, ist Problematik 1 geschuldet. Lediglich die Prüfung des Parameters durch den Zugriff über eine Superglobale führt hier zum Ziel.


Kollision von Parameterangaben

Ein weiteres Problem von register_globals ist, dass sich gleichnamige Parameter überschreiben. So wird beispielsweise je nach Einstellung der GET-Parameter $foo durch den POST-Parameter $foo überschrieben, der wiederum vom COOKIE-Parameter $foo überschrieben wird. Werden also mehrere gleichnamige Parameter auf verschiedenem Wege übergeben, so ist nur einer von ihnen schlussendlich verfügbar, da alle denselben Variablennamen (hier: $foo) für sich beanspruchen.

Alternative Verwendung von Superglobalen Arrays

Seit PHP Version 4.1.0 stehen für jede Art der Request-Parameterübergabe geeignete assoziative Arrays zur Verfügung, die die Werte unter dem Parameternamen als Schlüssel bereitstellen. Die Arrays sind superglobal, also in jedem Variablenraum verfügbar, und nach dem Typ des Request benannt. Ein GET Parameteraufruf mit ?foo=bar stellt bspw. ein Array $_GET mit folgendem Inhalt bereit:

array (
  "foo" => "bar"
  )

Statt der Benutzung des Parameternamens wird über den Schlüssel des Arrays auf den Wert zugegriffen:

// register_globals Syntax
echo $foo;
 
// Superglobals Syntax
echo $_GET['foo'];
 
// Syntax um von register_globals auf Superglobale umzustellen
$foo = $_GET['foo'];
// bzw.
$foo = $_REQUEST['foo'];

Entsprechend bündelt $_POST alle POST Parameter und $_COOKIE alle vom Browser gesandten Cookiedaten des Scriptaufrufs.

Links zum Thema


Alle Zeitangaben in WEZ +2. Es ist jetzt 02:24 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Powered by vbWiki Pro 1.3 RC5. Copyright ©2006-2007, NuHit, LLC

Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum