Ergebnis 1 bis 10 von 10

Thema: PHP: Die register_globals-Problematik

Baum-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1

    PHP: Die register_globals-Problematik

    Die register_globals = On Problematik

    Was bewirkt register_globals = On?

    Ist die Anweisung register_globals auf On (An) geschaltet, sind alle Variablen unter ihrem Namen verfügbar. Ein Beispiel:

    http://www.beispiel.de/index.php?variable1=hallo

    Hier werden über die URI (GET Methode) der Variable variable1 der Wert hallo gegeben. Diese Variable kann ein PHP Skript mit $variable1 aufrufen.
    Das ist auch mit der POST Methode möglich, dazu benötigt ein <input /> Element einen individuellen Namen:

    Code:
    ...
    <form action="./auswertung.php" method="post">
    <input type="text" name="variable1" />
    </form>
    ...
    Wird das Formular abgesendet kann ein PHP Skript die Variable $variable1 bearbeiten.

    Wo liegt das Problem?

    Da alle Variablen unter ihrem gegebenen Namen verfügbar sind, können sich Variablen aus der POST und der GET Methode mit selben Namen überschreiben, ferner kann PHP nicht unterscheiden, ob die Variable ihren Wert über die POST oder die GET Methode erhielt.
    Warum ist das wichtig? Nehmen wir an, der Benutzer einer Seite kann über ein Auswahlfeld eine Datei auswählen, von der der Quelltext gezeigt werden soll. Das Formular bietet nur Dateien an, die jeder sehen darf, da PHP aber nicht zwischen POST und GET Daten unterscheiden kann könnte ein Benutzer folgende URI eingeben:

    http://www.beispiel.de/formular-ziel...dmin_login.php

    Das Skript, das den Quelltext ausgibt, gibt nun den Quelltext der Datei admin_login.php aus. Eine hier vorhandene Passwortabfrage könnte so aussehen:

    Code:
    if ( $passwort == 'geheim' )
    { echo 'alle geheimen administrativen Funktionen'; }
    else
    { echo 'leider kein Recht auf Zugriff'; }
    Ein Hacker wüsste jetzt das Passwort für den Administrativen Bereich dieser Webseite.
    Dieses Beispiel entsprang der Fantasie des Autors, kann aber jederzeit schmerzhafte Tatsache werden, da es zeigt, welche Gefahr von register_globals = On ausgehen kann.
    Bei einem Skript wie diesem bieten sich noch andere Sicherheitslöcher an, aber diese stehen nicht direkt mit register_globals im Zusammenhang.

    Was wird dagegen unternommen?

    In der PHP Version 4.1 wurden so genannte Super- oder Autoglobale Arrays eingeführt, diese enthalten POST und GET, aber auch COOKIE, SESSION, FILES, SERVER und ENVIROMENT Daten. So werden diese Variablen im PHP Skript aufgerufen:

    $_POST['variable1']
    $_GET['variable1']

    Ein unübersehbarer Vorteil: PHP unterscheidet, ob die Variable ihren Wert über die POST oder die GET Methode erhielt, ferner überschriben sich POST und GET Variablen nicht, die den selben Namen haben. Lautet der Code des PHP Skripts, das den Quelltext ausgibt also wie folgt, wird eine Dateiauswahl per URI unmöglich gemacht.

    <?php show_source ( $_POST['datei'] ); ?>

    Achtung: Diese Methode macht es einem Hacker nur etwas schwerer. Da dieser jetzt selbst ein Formular schreiben könnte, ist es wichtig, die Variable $_POST['datei'] auf verschiedene Eigenschaften zu prüfen.

    Welche Superglobalen Arrays gibt es?

    [b]Variable - Verwendung[b]
    $_POST[''] für POST Daten
    $_GET[''] für GET Daten
    $_COOKIE[''] für Daten, die ein Cookie übermittelt
    $_REQUEST enthält POST, GET und COOKIE Daten (vermeiden, wenn nicht unbedingt benötigt)
    $_SERVER[''] für Daten, die vom Server ausgehen und an diesen gesendet werden, z.B. eigene IP Adresse (per phpinfo() einsehbar)
    $_ENV[''] für Umgebungsvariablen (per phpinfo() einsehbar)
    $_SESSION[''] für Daten, die in einer Session gespeichert werden (statt session_register($variable) sollte $_SESSION['variable'] = 'wert'; verwendet werden)
    $_FILES[''] für Dateien, die über ein Formular hochgeladen werden

    Das $_FILES Array enthält ein weiteres Array:

    Inhalt eines Formulars:
    Code:
    ...
    <input type="file" name="name_des_feldes"/>
    ...
    Diese Daten sind aufrufbar:
    Variable (Inhalt)
    $_FILES['name_des_feldes']['name'] (Name der Datei)
    $_FILES['name_des_feldes']['type'] (MIME Typ der Datei)
    $_FILES['name_des_feldes']['tmp_name'] (Name der Temporär angelegten Datei)
    $_FILES['name_des_feldes']['error'] (Fehlercode, erst seit PHP Version 4.2)
    $_FILES['name_des_feldes']['size'] (Dateigröße in Byte)

    Das ermöglicht ein einfaches realisieren eines gleichzeitigen Uploads mehrerer Dateien.

    Noch etwas?

    $_* Variablen sind global verfügbar, d.h. sie können in eigenen Funktionen ohne die Angabe "global \$variable;" aufgerufen werden.

    Geändert von mitaki (24.06.2011 um 21:40 Uhr)

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •