Sven Rautenberg: Was ist so kritisch an globalen variablen?

Beitrag lesen

Moin!

Wenn ich an ein Script - egela ob vom eigenen oder von einem bösen Server/Client aus Daten mit GET übergebe: script.php?daten=boese

Wenn du Daten vom User in einer bestimmten Variablen erwartest, ist das ganz und gar nicht böse, und es macht keinen Unterschied, ob du auf $daten oder $_GET['daten'] zugreifst. Du _willst_ ja, daß Daten kommen.

Schlimmer ist allerdings, daß man auf diese Weise auch Variablen definieren kann, die du in deinem Script für was ganz anderes benutzt. _Das_ ist das Problem.

Am besten ist vermutlich ein reales Beispiel. Lies einfach mal meinen Kommentar zu Philipps Script: http://forum.de.selfhtml.org/archiv/2002/6/15268/#m85650. Das Problem ist dort, daß ich per URL-Parameter "?richtig=1" eine Variable setzen kann, die im Skript selbst nicht initialisiert wird, sofern gewisse Bedingungen herrschen. Das ist das gefährliche.

Klar, daß sowas erst dann gezielt ausgenutzt werden kann, wenn man die Variablennamen kennt. Aber gerade bei den typischen Scriptarchiven kriegt man ja den Quelltext und kann nachgucken, welche Variablen benutzt werden und wie man vielleicht einen Fehler ausnutzen kann. Am schlimmsten ist dabei immer, wenn man eigenen Code auf dem fremden Server ausführen lassen kann. Das richtet hundertprozentig den größten Schaden an. include() ist leider für sowas anfällig, weil PHP fopen-wrappers benutzt: Du kannst eben auch http- und ftp-Zugriffe mit include machen und so Code von fremden Servern einbinden.

Und wenn man nicht per URL-Parameter in den Logfiles Spuren hinterlassen will (irgendwie muß man ja die URL des einzubindenden Codes übermitteln), dann nimmt man eben POST in einem Formular. Und auch da würde mit $_GET und $_POST ein Sicherheitsschutz greifen, denn wenn du die Parameter per GET erwartest, kann sie niemand mehr per POST unterjubeln.

Also merken: Die automatische Übernahme von Parametern in Variablen ist böse, und die fopen-wrappers sind böse. Es ist besondere Vorsicht vor allem dann angesagt, wenn der include()-Befehl variable Seiten zum einbinden erhält.

- Sven Rautenberg