[PHP] $_POST[] Verständnis frage

T-Rex

Active member
24 November 2007
28
2
Hi Experten,

Ich schweife gerade durch internet und stosse bei einem Forum auf eine Erklärung der "register_globals" funktion.
Da hat ein User gefragt wo der Unterschied darin liegt ob er seine variablen einfach so anspricht ($test) oder mittels $_POST ($_POST['test]). Ihm wurde dann geantwortet, dass es der Unterschied in der Sicherheit gibt.

Folgende ausgangssituation:
Ich hab ein Gästebuchformular mit dem man halt Gästebucheintrage schreiben kann. Es gibt nur 2 Felder -> User und text. Die zwei Felder werden nach betätigen eines Buttons dem Script gastbuch_bearbeiten.php übergeben und dann eben verarbeitet.
Wenn jetzt jemand diesem gastbuch_bearbeiten.php mit einem gefaktem Script falsche Informationen gibt, spielt es doch gar keine Rolle ob ich die Variablen mit $_POST oder einfach mit dem Variablen name anspreche, den die falschen Infos werden sowieso verarbeitet!?

Das bingt mich wieder zurück auf die Frage, wozu der Aufwandt mit den register_globals?

Danke fürs lesen
 
Zum einen können die Variablen auch über GET gesendet werden und dein Script macht fleißig Einträge. Zum anderen, was schlimmer is, können via register_globals Variablen von außerhalb in das Script eindringen, an die du nicht mal denkst.

Schlussendlich wird das besagte Gästebuch-Script irgendwo gar nicht mehr laufen, weil PHP einer derartig schlampigen Programmierung durch die Entfernung des Sicherheitslochs entgegen wirkt.
Drum: Lieber jetzt schon auf ordentlichen Code umsteigen und nicht erst, wenn irgendwann nichts mehr funktioniert.

Im PHP-Manual findest du einen Artikel über register_globals und dessen Auswirkungen auf die Sicherheit.
 
Wie können den Variablen in das Scrit eindringen, wenn ich diese Variablen nicht benutze?
Also mit anderen worten, wenn ich statt $_POST['username'] nur $username benutze können werte mit $_POST,$_GET,$_COOKIE und $username übergeben werden. Somit verringere ich lediglich die übergabe Methodik von 4 auf 1.
Wenn ich jetzt aber eine Seite hacken will, würde ich mit einem angriff auf allen 4 ebenen beginnen.
Und wieder bin ich bei der frage, wieso die globals off?
 
Wie können den Variablen in das Scrit eindringen, wenn ich diese Variablen nicht benutze?
Also mit anderen worten, wenn ich statt $_POST['username'] nur $username benutze können werte mit $_POST,$_GET,$_COOKIE und $username übergeben werden. Somit verringere ich lediglich die übergabe Methodik von 4 auf 1.
Wenn ich jetzt aber eine Seite hacken will, würde ich mit einem angriff auf allen 4 ebenen beginnen.
Und wieder bin ich bei der frage, wieso die globals off?

Das Problem, in einem Script gibt es teils hunderte von Variablen. Bei kleinem Gästebuch weniger. So können mit unqualifizierten Aufrufen schnell Variablen überschrieben werden, an die du überhaupt nicht dachtest aber lebenswichtig bzw. sicherheitsrelevant sind. zb. von php selbst oder von einem verwendeten Framework.

So hast du villeicht eine Variable $dbname um auf datenbank zuzugreifen, überschreibt jemand diese mit der systemdatenbank und kann wegen falsch verendeteten benutzerrechten daruf zugreifen, kann man sich alle datenbanen, alle nutzer und ähnliches ausgeben lassen.

Hast du eine variable $sql, für eine Datenbankabfrage, kann ein Nutzer von aussen dies überschreiben und mit deiner datenbank nahezu alles vorstellbare und nicht vorstellbare anfangen.

Selbst wenn du keine Datenbank nutzt, sondern direkt in dateien schreibst, könnte einer verwendete Variablen wie $MeinPfad überschreiben und so auf Verzeichnisse zugreifen, wo er auch nichts zu suchen hat und viel schaden anrichten kann.

mit register_globals werden diese Probleme abgefangen. So kann man direkt auf die werte, die man wirklich nutzt in $POST bzw $GET zugreifen und hat seine internen Variablen immernoch unter kontrolle.

Die böseste Falle ist die Methode eval(). An sich eine genial. Man kann PHP Code in eine Variable laden und diesen Ausführen lassen. Entsprechend wird auch versucht, Variablen mit PHP-Code wie einfachen phpinfo() zu füttern. So bekommt man einmal die Informationen, was auf dem System alles genutzt wird und kann weitere direkte Attacken mittels PHP-Code durchführen. Das kann vom direkten Angriff auf die Seite bis zum missbrauch als eMailverteiler für Spam gehen.

Mit den unterschiedlichen Angriffsvarianten hast du zwar recht, nur sind die meisten Hacker faul. Sie testen verschiedene Szenarien an und haben sie eine Lücke gefunden, so schauen sie wie weit sie dort kommen oder in wie weit sie dies mit einer anderen Methode kombinieren können. Es gibt sogar Tools, die mehrere Szenarien automatisch durchspielen und man anschliessend sieht mit was man den Server dann als Hacker nutzen kann.

Ein Thema mit dem du dich auch beschäftigen solltest sind SQL-Injections.