Suchen
Inside Wiki
Nützliche Links
PHP Jobs
phpforum.de Tipp
 
phpforum.de bei Facebook
 
phpforum.de bei Twitter
 

Zurück   PHP Forum: phpforum.de > phpforum.de Wiki > phpforum.de Wiki

PHP Wiki Dieses Wiki sammelt Lösungen, zu Problemen, welche immer wieder im Forum auftauchen.

 
 
Artikel-Optionen Ansicht
  #1  

Standard Register Globals

 

Tutorials - Inhalte

"Hilfe meine Variablen"



Wer das hier liest hat ein Problem, ein großes Problem - seine Scripte laufen nicht mehr. Und man hat in der Regel nicht einmal etwas geändert. Aber jetzt erstmal: Nur die Ruhe, keine Panik kriegen, das bekommen wir schon wieder hin.
Wen betrifft dieser Text überhaupt?
Nun, der typische Anwender mit den beschriebenen Problemen zeigt folgende Merkmale:

a) sein Provider oder er selbst haben PHP in Version 4.2 oder höher laufen. Möglicherweise auch niedrigere Versionen, aber das ist eher untypisch.

b) wenn er eine Datei wie die folgende ausführt

PHP Quellcode:
<?php
  phpinfo();
?>


entdeckt er eine Zeile die ihm sagt, dass "register_globals" auf "Off" geschaltet ist.

c) er verwendet Variablen, die "in der URL" (per GET-Request) übergeben werden und diese sind "auf einmal nicht mehr da". Analog natürlich auch für POST-Requests, Cookies etc.

Auf wen das obige nicht zutrifft, der braucht diesen Artikel nicht mehr weiter zu lesen und darf wieder Panik bekommen. Der gesamte Rest findet hier Erleuchtung.

Was ist passiert?



Nun, diese Frage stellt sich den meisten zwar nicht zuerst, aber wie will man ein Problem lösen, dessen Ursache man nicht kennt? Also:
In PHP gibt es eine Einstellung, die in der zentralen Konfigurationsdatei - der php.ini - getätigt werden kann und sich register_globals nennt. Diese ist dafür zuständig, dass Variablen direkt unter ihrem Namen verfügbar sind, also bei einem Aufruf von "index.php?seite=test" eine Variable $seite existiert und "test" enthält. Diese ist eigentlich ganz praktisch, aber auch eine gefährliche Falle wie wir später sehen werden.
Jedenfalls haben sich die Entwickler von PHP entschlossen, diese Einstellung ab PHP 4.2 auszuschalten. Die Variablen werden also in der Standardkonfiguration nicht mehr so wie früher zur Verfügung gestellt.

Wieso haben die das gemacht?



Die Überlegungen hinter dieser Entscheidung sind für uns normale Anwender auf den ersten Blick ziemlich mysteriös: Wieso sollte jemand so etwas praktisches Ausschalten?
Folgendes Beispiel:
Viele Seiten verwenden geschützte Bereiche irgendwelcher Art, zum Beispiel zur Administration. In vielen Scripten findet sich hierzu eine Weiterleitung auf eine Seite oder andere Methode eine Seite zu laden, die ein Passwort abfragt, wenn sich in der Session keine Variable wie etwa $validuser = 1; befindet. Wenn diese Variable gesetzt ist kann angenommen werden, dass der Benutzer bereits authentifiziert ist.
Jetzt kommt der Haken hieran:
Ein Aufruf der fiktiven /administration/index.php Seite mit "index.php?validuser=1" macht was? Genau, es lässt jeden Benutzer ohne nötige Authentifizierung an die Administration der Seite.

Das Beispiel mag an den Haaren herbeigezogen wirken, aber in der Tat findet man häufig Scripte die solche Sicherheitslücken haben, auch wenn sie dort nicht so tragisch wirken. Die Entwickler hatten also allen Grund dieses Verhalten von PHP standardmäßig einzuschränken, um die ausgeführten Scripte sicherer zu machen.

GET? POST? Was ist das?



Wer sich die obigen Fragen beantworten kann, kann diesen Abschnitt getrost überspringen, aber hier wird später benötigtes Basiswissen vermittelt.
Es handelt sich hinter diesen kurzen Wörtchen wie "GET-Request" oder "POST-Request" darum, wie Werte an den Webserver übertragen werden. Dabei handelt es sich um zwei ziemlich verschiedene Vorgehensweisen:
Bei einem GET-Request werden die Daten innerhalb der Anfrage der Seite an den Server aufgenommen - man sieht die Variablen also in der Adresszeile des Browsers.
Ein POST-Request geht jedoch anders vor und überträgt die Daten zwar auch beim Aufruf der Seite an den Server, aber außerhalb der Adresse der Seite in speziell dafür vorgesehenen Teilen der Anfrage - der Benutzer sieht die Daten also nicht in der Adresszeile.
Es ist, um das Problem lösen zu können, wichtig zu wissen, wie die Daten an den Server übertragen werden. Generell kann man dies aber auch an seinem eigenen HTML-Quelltext erkennen:
Wenn man ein Formular verwendet findet sich im form-Tag in der Regel ein Attribut method. Sollte dort stehen method="POST" so ist die Übertragungsmethode klar zu erkennen - ebenso bei method="GET". Sollte sich keinerlei Angabe dazu finden, so ist von einem GET-Request auszugehen.
Wenn man absolut keine Ahnung hat, woher seine Daten nun kommen hilft auch ein phpinfo() im Script. Dort sieht man dann am unteren Ende der langen Liste alle übergebenen Werte und - wichtiger - wie diese übergeben wurden.

Und wie werde ich das los?



Nachdem nun klar ist, was passiert ist und wieso dies so passiert ist geht es an die wohl wichtigste frage: Wie bringe ich meine Scripte wieder zum laufen?
Nun, hier heißt es zuerst kurz Luft holen, da hier je nach Größe der Scripte einiges an Arbeit auf einen zukommen kann.
Statt in Zukunft direkt auf eine Variable $test zuzugreifen findet dieser Zugriff über bestimmte vordefinierte Arrays statt. Wichtig ist es hierbei zu wissen, wie die Daten übergeben werden (siehe dazu obigen Abschnitt über GET und POST), da hiervon das zu verwendende Array abhängt.
Der erste Schritt dazu seine Scripte wieder flott zu machen besteht also darin, festzustellen und am besten irgendwo eine Liste zu erstellen (je nach Aufwand des Scriptes) welche Variablen wie wohin übergeben werden. Das wird wohl die meiste Zeit und die meisten Nerven in Anspruch nehmen - hier hilft es selbst mal wieder durch die eigene Internetseite zu surfen und alle Formulare und per GET übergebene Variablen genau anzusehen.
Nachdem wir nun wissen welche Variablen woher kommen können wir unser Script endlich an die neuen Gegebenheiten anpassen.
An per GET übergebene Variablen kommen wir in Zukunft über das vordefinierte Array $_GET[].
Beispiel: Unsere Variable wird über text.php?seite=text übergeben - dann erhalten wir "text" mittels $_GET["seite"].
Analog kommen wir an unsere POST-Variablen: $_POST[].
Die Aufgabe besteht nun - nachdem wir ja schon wissen welche Variablen ersetzt werden müssen - darin, jede $variable aus einem GET-Request in $_GET["variable"] und jede POST-Variable von $variable in $_POST["variable"] zu übersetzen.

Beispiel


Bisher funktionierte das folgende Beispielskript wunderbar:
PHP Quellcode:
<html>
<body>
<?php
  if(isset($formsent)) {
    echo "Hallo, " . $name;
  }
?> 
<form method="post" action="index.php">
Name: <input type="text" name="name" value="Ihr Name"/><br/>
<input type="submit" name="formsent"/>
</form>
</html>

Wie wir oben gesehen haben stehen nun $formsent und $name nicht mehr in dieser Form zur Verfügung. Alles, was getan werden muss, ist das Skript wie folgt umzuformulieren:
PHP Quellcode:
<?php
  if(isset($_POST['formsent'])) {
    echo "Hallo, " . $_POST['name'];
  }
?>


Okay, aber es geht noch nicht alles!



Was noch immer nicht funktioniert ist jedoch eines: Wir kommen noch immer nicht an unsere Sessions, unsere Cookies und Sachen wie die IP des Besuchers. Die Lösung hier ist jedoch denkbar einfach, da analog zu den schon gesehenen:
* $_FILES[] enthält Informationen über vom Benutzer hochgeladene Dateien
* $_SESSION[] enthält unsere in einer Session gesicherten Daten.
* $_COOKIE[] erfüllt die selbe Funktion für in Cookies gespeicherten Variablen.
* Und last but not least $_SERVER[] enthält vom Server vorbesetzte Variablen wie $_SERVER["REMOTE_ADDR"] und andere alte Bekannte.

PHP5.4


Mit PHP5.4 wurde register_globals endlich auf den Müll geworfen. Die vom Browser kommenden Daten sind ab dieser Version nur noch über die superglobalen Arrays erreichbar.

So, mit diesem Wissen gestärkt sollte ein modernes PHP keine große Hürde darstellen. Nur eines noch zum Schluss: Sicher sind schon einige auf die Idee gekommen register_globals einfach wieder einzuschalten und lesen das hier erst garnicht. Wer es dennoch tut sollte sich das einführende Beispiel nochmals ansehen und durch den Kopf gehen lassen.

« Vorheriges Kapitel   Tutorials
  Nächstes Kapitel »

Erstellt von combie, 19.01.2008 am 17:43
Zuletzt bearbeitet von tk1234, 02.03.2014 am 13:52
0 Kommentare , 15432 Betrachtungen

Dieser Text steht unter der GNU-Lizenz für freie Dokumentation


 

Lesezeichen

Stichworte
grundlagen, php6, register_globals, tutorial

Artikel-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.

Gehe zu
Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
register globals off zeal77 PHP 14 12.11.2007 09:26
register globals PHP - Noob PHP 19 26.02.2006 23:39
register globals: session i2c2k PHP 2 07.06.2005 16:12
Register Globals LeChuck PHP 6 12.08.2004 09:31
register globals athenaise PHP 1 26.04.2004 10:26


Alle Zeitangaben in WEZ +2. Es ist jetzt 00:38 Uhr.


Powered by vBulletin® Version 3.8.8 (Deutsch)
Copyright ©2000 - 2016, Jelsoft Enterprises Ltd.
Powered by NuWiki v1.3 RC1 Copyright ©2006-2007, NuHit, LLC