register_globalls

bigtail

Mitglied
Hi,

Warum ist eigentlich register_globalls=ON so unsicher
Ich habe auch in PHP-Manuall nachgeschaut und nicht wirklich schlauer geworden.
Nun hat es mir jemand wie folgt erklärt:

Bisher war es so:
Du hast ein Formularfeld mit Name="vorname", das Feld wurde beim Senden an z.Bsp. action="formular.php" übergeben und war da als $vorname verfügbar. Es konnte aber nicht sichergestellt werden das es sich bei dem Wert auch wirklich um die Variable aus dem Formular handelt, wenn jemand den entsprechenden Feldnamen herausfindet kann der auch einen beliebigen Wert übergeben, das kann bei u.U. ganze Datenbanken löschen etc.

Jetzt ist es so:
PHP weiss nun in einen solchen Fall, das der Wert von Vorname nur unter der PHP-internen Variablen $_POST["vorname"] gespeichert sein darf. Das stellt sicher dass es sich auch um den gesendeten Wert handelt.

Aber wenn jemand den Wert für $Vorname manipulieren kann, warum soll er den Wert von $_POS['Vorname'] nicht manipulieren können

Kann mir bitte jemand etwas genauer (Vielleicht an Hand eines Beispieles) das erklären


Danke
 
also früher konnte man das Script in etwa so überlisten:

anstatt, dass z.B. ne Variable aus nem Formular per POST übermittelt wurde, z.B. "aktion", konnte man ganz einfach das Script, an welches die Daten aus dem Formular nach dem Abschicken gesendet werden, aufrufen und die Variablen per GET übergeben.

Folgendes Szenario: In einem Formular kann ein User auswählen, ob er einen Datensatz erstellen, editieren oder sogar löschen möchte. Die gewählte Aktion wird z.B. im Feld mit dem Namen "aktion" an das Script weitergeleitet. Das bedeutet, in dem Script, was diese Variable nun verarbeitet, griff man so darauf zu:
$aktion.
Allerdings ist es dem PHP-Script nun egal, ob $aktion wirklich aus dem Formular per POST, per URL mittels GET oder über andere Wege übermittelt wurde.
Das heißt also, als "böser User" hätte man das Script auch so ansprechen können: script.php?aktion=loeschen und das Script hätte nichts "bemerkt".
Könnte man so auch noch eine entsprechende ID oder ein MySQL-Query o.Ä. übergeben und das Script würde dann beispielsweise einen kompletten Datensatz löschen.
Du siehst also, register_globals=on kann ein großes Sicherheitsrisiko darstellen.
(Stell dir eine solche Szene mal in einer DB-Tabelle vor, in der die Log-In-Daten der Admins gespeichert sind. Jemand mit bösen Absichten könnte sich so z.B. einen neuen Adminaccount anlegen oder auch einen Admin löschen etc.)


Mit den neuen superglobalen Variablen $_POST und $_GET kann man als Entwickler des Scripts solche Lücken dann ganz einfach schließen. So kannst du sicher stellen, dass die angenommenen Variablen auh wirklich nur aus dem Formular kommen, indem du eben ausschließlich mit den $_POST-Variablen arbeitest oder überprüfst, ob die Variablen aus dem Formular stammen (isset($_POST['var']) und so weiter und so weiter.... Sollte dann jemand versuchen dein Script mit GET-Variablen zu missbrauchen, dann wird er damit keinen Erfolg haben.

Naja, so viel mal dazu. Ich weiß, es ist nicht besonders gut erklärt und das Beispiel ist vielleicht auch nicht das Beste, aber das Prinzip wird hoffentlich klar.
 
Nicht nur das...

sonden nimm das folgende beispiel:

PHP:
$privilegs //array, kommt per formulardaten

foreach($privilegs as $key => $value) {
    $privilegsCount+=1;
}

So, nun soll ein script die anzahl der selektierten privilegien prüfen, für irgend n sicherheitssystem oder sonst was, funktioniert einwandfrei da jede nicht initialisierte variable standartmößig 0 ist, auch wenn es n notice darüber gibt, egal..

Was ist nun aber wenn ich test.php?privilegsCount=3&...
aufrufe?
Währe nicht gut, das ergebnis von privilegsCount würde nicht mehr stimmen, da er ja nicht bei 0 anfängt...

Jetzt stell dir das ganze mal bei einem CMS vor!, wo jemand genau aufgrunf eines solchen fehlers Administrations zugriff bekommt, und allerhand anstellt... währe nicht gut.
 
Zurück