Moin!
irgendwie blick ich nicht ganz durch.
Wir helfen gern.
Also Get, Post und Cookie sind superglobale Variablen die immer verfügbar sind, ohne register_globals on, richtig?
Die Variablen werden alle durchgehend GROSS geschrieben, und haben vorneweg einen _UNTERSTRICH - und natürlich das Dollarzeichen. Ansonsten ist deine Aussage richtig.
Was sind dann globale Variablen (gibts da einen Unterschied?)
Da gibt es einen Unterschied. Globale Variablen sind die, die du außerhalb von Funktionen im Hauptprogramm definierst und benutzt. Im Unterschied zu superglobalen Variablen kannst du innerhalb von Funktionen nicht auf globale Variablen zugreifen. Und das ist auch gut so, weil Funktionen Werte mit der "Außenwelt" Hauptprogramm nur über ihre Parameter und Rückgabewerte austauschen sollen.
was aktiviere ich mit register_globals on
register_globals=on erzeugt dir vor dem Skriptstart schon eine Sammlung globaler Variablen mit den Inhalten aus GET, POST, FILES, COOKIE, ENV, SERVER und SESSION.
Angenommen, folgende URL wird aufgerufen: http://www.example.com/test.php?wert=zwanzig
Ohne register_globals kannst du den Wert so nutzen:
echo $_GET['wert']; // schreibt den String 'zwanzig'
Mit register_globals geht das obige immer noch.
Und zusätzlich geht das hier:
echo $wert; // schreibt ebenfalls 'zwanzig'
Das Problem dabei ist: Jeder kann an der URL rummanipulieren, damit kann jeder beliebige globale Variablen definieren - auch die, die du später in deinem Skript selbst benutzt. Wenn du die Variablen dann "einfach so" nutzt, ohne ihnen zuerst einen definierten Wert zuzuweisen, kann ein Angreifer beliebige Vorbelegungen in die Variablen schreiben, und dein Skript so mißbrauchen, sich reinhacken etc.
und was mit import_request_variables('gp','');
Die Funktion import_request_variables erzeugt, genau wie register_globals, globale Variablen aus verschiedenen Quellen. Ist also im Ergebnis gleichwertig. Der einzige Unterschied: Es passiert nicht automatisch, sondern manuell, das bringt eventuell etwas mehr Sicherheit, zweitens kann man genau bestimmen, welche Datenquellen übernommen werden sollen (im Beispiel hast du "gp" angegeben, das steht für GET und POST, alle anderen Werte bleiben weg), und drittens kann man allen erzeugten Variablennamen noch einen Prefix vorsetzen (da hast du '' angegeben, also keinen Prefix).
Um das Beispiel von oben fortzusetzen:
import_request_variables('gp',''); // GET und POST importieren
echo $wert; // schreibt 'zwanzig'
Kein Unterschied bei der URL:
import_request_variables('g',''); // nur GET importieren
echo $wert; // schreibt 'zwanzig'
Mit Prefix:
import_request_variables('g','get_'); // GET mit Prefix importieren
echo $get_wert; // NEUER Variablenname!
Und der Import nur von POST bei gleicher URL:
import_request_variables('p',''); // nur POST importieren
echo $wert; // schreibt nichts! Variable nicht definiert!
Das Problem ist halt das dieses Problem mehrere Seiten betrifft und eine Umstellung im Skript sehr aufwändig ist. Für alle Websites möchte ich register_globals aber nicht "aktivieren".
Du hast das Problem, dass du ein Skript hast, das noch auf PHP 3 abgestimmt ist. Mittlerweile haben wir PHP 5 als aktuelle Version, selbst PHP 4 stirbt schon aus.
Der Schritt von 3 auf 4 war tatsächlich mit etlichen Umstellungen verbunden. Kein Versionswechsel läuft wirklich 100% reibungsfrei.
Deshalb ja der ganz dringende Appell: Schreibe das Skript neu. Klar ist das aufwendig, aber wenn du für die nächste Zeit Ruhe haben willst, dann installier PHP 5 und schreibe das Skript gleich auf diese Version um. Ohne register_globals natürlich!
- Sven Rautenberg
"Love your nation - respect the others."