Tomatenheini: Register Globals

Hallo,

nach einem Serverwechsel funktionieren einige ältere Php-Skripte nicht mehr, der Grund ist laut Provider die Register-Globals-Einstellung.

Jetzt meine Fragen:

a) Welche Gefahr besteht bei der Änderung der Einstellung, d.h. wenn ich die Register-Globals "off" schalten lasse?

b) Mein Provider hat zwei meiner Skripte geändert, jetzt laufen sie - gibt es eine Anleitung dafür, wie man Skripte anpassen kann, damit sie bei der On-Einstellung laufen?

Vielen Dank, Gruß

  1. Hallo,

    einen ersten Überblick verschafft dir ggf. http://de.php.net/manual/de/security.globals.php

    Gruß Gunther

  2. a) Welche Gefahr besteht bei der Änderung der Einstellung, d.h. wenn ich die Register-Globals "off" schalten lasse?

    Lies http://de2.php.net/register_globals, da ist alles erklärt.

    b) Mein Provider hat zwei meiner Skripte geändert, jetzt laufen sie - gibt es eine Anleitung dafür, wie man Skripte anpassen kann, damit sie bei der On-Einstellung laufen?

    Verwende die superglobals http://de2.php.net/manual/en/language.variables.superglobals.php, dafür sind sie da.

    ~JJ

  3. echo $begrüßung;

    a) Welche Gefahr besteht bei der Änderung der Einstellung, d.h. wenn ich die Register-Globals "off" schalten lasse?

    Die Einstellung on ist die "gefährliche". Im Grunde genommen ist Register Globals ein harmloses Feature, wären nicht auch noch Sicherheitslücken aufgrund beispielsweise fehlerhafter $GLOBALS-Implementierung in alten PHP-Versionen enthalten (gewesen). Die Gefahr sind schlampige Programmierer, die auf eine explizite Initialisierung von Variablen mit Defaultwerten verzichten. Da Register Globals für alle Werte aus $_GET, $_POST und $_COOKIE extra Variablen anlegt, kann jemand beliebige Variablen mit beliebigem Inhalt anlegen.

    foreach ($array as $wert)
      $string .= $wert;

    Dieses Stück Code hängt alle Werte aus dem $array an $string an. Dazu wird $string zuerst gelesen, der $wert angehängt und der neu entstandene String in $string geschrieben. Wenn $string nicht vorhanden ist, liefert der Lesevorgang NULL zurück, was durch PHPs automatische Typkonvertierung zu einem Leerstring wird. Wenn mittels register_globals ein Parameter namens "string" übergeben wurde, dann ist $string vor dem Schleifendurchlauf mit eben dem Wert aus dem Parameter initialisiert. Je nach weiterer Verarbeitung kommt nun der von außen eingeschleuste Wert an Stellen, an denen man ihn nicht haben will, beispielsweise die Ausgabe der Seite, womit dann beispielsweise HTML oder Javscript an den Browser ausgegeben wird, den der Autor nicht vorgesehen hatte. Dies wäre eine XSS-Lücke.

    Initialisiert man seine Variablen vor dem Gebrauch kann einem eine Einschleusung von Werten über Register Globals nichts anhaben.

    Dass Variablen nicht initialisiert sind, erzählt einem PHP, wenn man die in der Defaulteinstellung unterdrückten Notice-Meldungen aktiviert, indem man das error_reporting auf E_ALL (und display_errors auf on) stellt.

    b) Mein Provider hat zwei meiner Skripte geändert, jetzt laufen sie - gibt es eine Anleitung dafür, wie man Skripte anpassen kann, damit sie bei der On-Einstellung laufen?

    Falsch wäre die Verwendung von extract() oder import_request_variables(), ohne einen eindeutigen Prefix zu verwenden, so dass andere Variablen überschrieben werden können oder Variablen angelegt werden, die man später anderweitig verwenden will. Wobei dies nur zusammen mit der oben erwähnten Schlamperei ins Gewicht fällt.

    Gern von Anfängern gemacht aber unsinnig ist das Umkopieren à la

      $foo = $_POST['foo'];

    Nun hat man zwei Variablen mit gleichem Inhalt, erhöht damit die Komplexität des Scripts und als Ergebnis sieht man einem $foo noch nicht mal seine Herkunft als Benutzereingabe an.

    Richtig wäre die Verwendung von $_POST['foo'] an Stellen, an denen man vorher $foo verwendet hatte. Weitere Pluspunkte gäbe es, wenn zudem noch der Eingabewert auf (un)zulässigen Inhalt überprüft würde.

    Ich wette, dass dein Provider sich nicht die Arbeit gemacht hat, diesen Austausch vorzunehmen, sondern stattdessen eine der eben genannten "Alternativen" verwendet hat. Wenn doch, wäre ich positiv überrascht.

    Auch noch wichtig wäre eine Überprüfung des Scripts auf weitere sicherheitsbedenkliche Lücken wie vergessene kontextgerechte Behandlung von Ausgabewerten.

    echo "$verabschiedung $name";