Stoppt die Vorratsdatenspeicherung! Jetzt klicken &handeln! Willst du auch an der Aktion teilnehmen? Hier findest du alle relevanten Infos und Materialien:

Navigation:

Besucherzähler:

  • Derzeit online: 5
  • Insgesamt: 47501

Spamfresser:

  • Spams: 11679

RegisterGlobals, was ist das?

Kategorie PHP & MySQL

Datum: 30.05.2008, 22:30 - Autor: Manko10

RegisterGlobals ist ein Überbleibsel aus alten Zeiten. Ein Stück Nostalgie, das Opa bei sich zu Hause als Trophäe aus jungen Jahren an der Wand hängen hat. Genau zwischen Hirsch und Eber.
Es gab Zeiten, zu denen PHP noch nicht in der Version 5 vorlag. Das ist lange, lange her. Für Programmierer fast eine ganze Zeitepoche. Damals mauserte sich PHP gerade von den niedlichen Personal Homepage Tools allmählich zu einer Programmiersprache.
Zu dieser Zeit gab es eine hübsche und possierliche Funktionalität, mit der man einfach und bequem von außen übergebene Variablen im Skript benutzen konnte.

Nun kam Tante Ilse, öffnete ihren Internet Explorer 5.55 und rief die Seite ihres Neffen Heinrich auf, auf der jener Goldfische zum Verkauf anbot.
Um einen besonders nett aussehenden rosa Goldfisch mit grünen Flossen zu bestellen, füllte sie ein kleines Formular aus und sandte es an den Server. Dort wurde die Anfrage dann durch ein kleines PHP-Skript verarbeitet und gespeichert.
PHP-Code:
1:
2:
3:
4:
5:
6:
if ($name != '' && $menge 0) {
    echo 
'Vielen Dank!';
    
// $name und $menge in Datei schreiben
} else {
    echo 
'Schade, dass Sie das Formular falsch ausgefüllt haben!';
}
Ein hübsches Skript, dank dessen Tante Ilses Aquarium um noch ein Fischchen voller wurde (dass sie irgendwann einmal vergaß, die Heizung des Aquariums auszustellen, ist eine andere Geschichte).

Doch nun trat ein Problem auf. Heinrich hatte sich aus Versehen bei einen Ausbau des Skripts vertan. Er benutzte die Variable $name aus Gedankenlosigkeit zwischendurch für andere Zwecke. Und schwupps... stellte sich der lustige Effekt ein, dass die Daten, die an das Skript übergeben wurden, vernichtet waren.
Doch abgesehen von der moderaten Lästigkeit stellt sich auch die Frage der Sicherheit. Was passiert, wenn man im Skript eine Variable verwendet, ohne sie vorher initialisiert, also mit einem Wert vorbelegt zu haben?
So wäre es jedem möglich, von außen schädliche Inhalte in das Programm einzuschleusen.
Das klingt doch amüsant, oder?

Gehen wir weiter in der Geschichte.
Wir schreiben das Jahr 2001 - die gesamte PHP-Welt ist von Sicherheitslücken besetzt. Die ganze PHP-Welt?
Ja, die ganze PHP-Welt. Eine Neuerung ist erforderlich. Es kommt also die brandneue PHP-Version 4.1.0 und eine Reihe von Arrays, die sogenannten Superglobals werden eingeführt. Diese haben recht witzige Namen, die komischerweise sogar bezeichnend für ihre Bedeutung sind. Man nannte sie $_GET, $_POST, $_COOKIE, $_REQUEST, $_FILES, $_SERVER, $_SESSION und $_ENV

Mithilfe dieser global verfügbaren Variablen war es Heinrich nun möglich, seine Anwendung ein wenig umzuschreiben:
PHP-Code:
1:
2:
3:
4:
5:
6:
if ($_POST['name'] != '' && $_POST['menge'] > 0) {
    echo 
'Vielen Dank!';
    
// $_POST['name'] und $_POST['menge'] in Datei schreiben
} else {
    echo 
'Schade, dass Sie das Formular falsch ausgefüllt haben!';
}
Somit wäre zumindest das versehentliche Überschreiben von Variablen weitest gehend ausgeschlossen. Ein Problem bestand aber weiterhin: da die Superglobals nur ein Zusatz, nicht aber ein Ersatz waren, konnten nicht initialisierte Variablen fatal auf eine Anwendung wirken.
Welch ein Glück, dass es schlaue Köpfchen gibt. Wenn man nur gründliche genug suchte, fand man in der php.ini (also der Konfigurationsdatei jener Programmiersprache, über die ich schon im gesamten Artikel geschrieben habe) eine Einstellung, genannt register_globals. Diese war per default auf On gesetzt, doch konnte man sie getrost auf Off setzen und schon war Heinrich glücklich gemacht.
Findige Systemadministratoren brauchte es aber, damit diese Möglichkeit auch genutzt wurde, sodass sie ab dem nächsten Main-Release, also PHP 4.2.0, standardmäßig auf Off gestellt wurde, wie sie es bis heute noch ist.
Das war im Jahre 2002, also vor 6 Jahren.

Kommen wir in die Gegenwart zurück. Wir befinden uns im Jahre 2008 und in Zeiten von PHP 5, während PHP 6 bereits im Geburtskanal steckt. Alles scheint sich zum Guten oder wenigstens zum Besseren zu wenden.
Doch da! Eine Flut von Usern überschwemmt die PHP-Foren, welche die Dämme kaum noch halten können. Die Pest ist ausgebrochen!
Nein, doch nicht.
Dank einer nicht zu verachtenden Masse an genialen Tutorials, geschrieben von Old-School-Programmierern, gewinnt RegisterGlobals wieder die Oberhand.
Klagen, nichts als Klagen! Bittschriften, nichts als Bittschriften! Und vor allem eine Menge User, die verwirrt feststellen, dass ihre Skripte gar nicht funktionieren, wie es in den (zumeist wohl seit mehr als einem halben Jahrzehnt nicht mehr gepflegten) Tutorials beschrieben ist.
Vielleicht haben einige dieser User ihre PHP-Lektüre auch im Antiquariat oder im Museum für Weltliteratur gekauft...
Also was tun? Lynchen, morden, meucheln oder aufhängen?
Ein anderer Vorschlag wäre eine Kennzeichnung solcher Tutorial-Seiten, wie man es schon bei ähnlichen Suchtmitteln getan hat:
RegisterGlobals kann tödlich sein
oder
RegisterGlobals fügt Ihnen und den Menschen in Ihrer Umgebung erheblichen Schaden zu

Übrigens: habe ich eigentlich schon erwähnt, dass das Flag register_globals mittlerweile als deprecated, also missbilligt, eingestuft wurde und in PHP 6 vollständig entfernt wird? Das wird sicher ein Spaß. :D

Der geneigte Leser kann sich ja nun nach der Lektüre dieses Artikels im Netz umsehen und eine Abmahnwelle gegen Verbreiter von RegisterGlobals starten. Ich distanziere mich hiermit jedoch ausdrücklich von jeglichem Mitwissen und beende damit diesen Artikel.

Seiten: (1/1) 1


War dieses Tutorial hilfreich?

2 Kommentare:

Köstlich

Datum: 26.08.2008, 17:22 - Autor: Gast

ich geh eine Zitrone auslutschen, damit das dämliche Grinsen aus meinem Gesicht verschwindet :-)

Datum: 27.12.2008, 14:37 - Autor: Gast

tja, da ist wohl was wahres dran.

Kommentar schreiben: