Moin!
do{
$write = fopen("datei_$i.txt", w);
fclose($write);
}while($i < 5);Sieht doch auf den ersten Blick ganz vernünftig aus um 5 leere Textdateien zu erstellen, oder?
Naja, das Beispiel oben wird, weil $i niemals erhöht wird, auch endlos laufen. Da fehlt irgendwo noch ein $i++. Mindestens.
Was passiert nun aber wenn ein besucher dieses in die Adressleiste tippt:
script.php?i=6
Genau, $i hat plötzlich den Wert 6 und die Abbruchbedingung ist unwahr. Das heisst plötzlich wird dein Script nicht mehr abbrechen und dir die ganze Festplatte mit Dateien zuschreiben
Das stimmt nicht, denn die Schleife wird am Ende jedes Laufes auf die Abbruchbedingung hin geprüft. Wenn $i schon gleich auf 6 gestellt wird, ist 6 < 5 falsch und die Schleife endet. Gleich nach dem ersten Dateiöffnen.
Das ist doch einfach nur unsauber programmiert, denn wenn ich die Variable mit $_get[$i] "abhole hat diese doch trotzdem noch den falschen Wert?
Wie doof das Beispiel ist, hab ich angemerkt. Dass ich Probleme kriege, wenn ich den Wert von $i oder $_GET['i'] durch den Benutzer bestimmen lasse ("Wieviele Dateien soll ich anlegen? 1.000.000?"), stimmt auch. Wenn ich aber den Wert von $i nicht vom Benutzer bestimmen lasse, also nicht $_GET['i'] verwende, sondern $i intern verwende, dann macht das bei schlechter Programmierung einen Unterschied.
Schlecht ist eben sowas:
while ($i < 5)
{
//hier irgendwas tun
$i++
}
Wenn $i vorher niemals verwendet wurde, wird es mit 0 initialisiert, und die schleife läuft mit 0, 1, 2, 3 und 4.
Normalerweise verwendet man aber keine uninitialisierten Variablen. Da könnte sonstwas drinstehen, weil man vielleicht in irgendeiner Include-Datei geschlampt hat und $i schon mit 1325 initialisiert wurde.
Deshalb ist sowas besser:
$i = 0;
while ($i < 5)
{
//hier irgendwas tun
$i++
}
Oder (weil es für diese simple Aufgabe kürzer und besser ist - aber identisch in der Funktion):
for ($i=0; $i<5; $i++)
{
// hier irgendwas tun
}
:)
Hat also mit register_globals erst einmal nichts zu tun!?
Doch. Das Problem mit register_globals sind immer uninitialisierte, globale Variablen. Man wird vor allem diejenigen globalen Variablen mit Werten vorbelegen, bei denen der Programmierer eine Vorbelegung durch den Benutzer garnicht vorgesehen hat. Nicht die vom Programmierer erwarteten Variablen sind das Problem, sondern die unerwarteten!
$_GET & Co. löst das Problem, indem die erwarteten Variablen vom Programmierer explizit benannt und quasi "abgeholt" werden müssen, während alle unerwarteten Variablen zwar auch in $_GET stehen, aber einfach nicht verwendet werden, wenn der Programmierer sich nicht vollkommen blöde anstellt.
Das Problem wird _nicht_ durch die Verwendung von $_GET gelöst, sondern durch die Einstellung "register_globals=off". Das ist bei vielen Providern aber leider immer noch nicht der Fall, so dass man trotz Verwendung von $_GET zusätzlich noch darauf achten muß, dass man alle globalen Variablen initialisiert. Insofern führt die Verwendung von $_GET möglicherweise sogar zu größerem Leichtsinn, weil man sich irrtümlich sicher fühlt, obwohl die Sicherheit erst durch eine simple Servereinstellung hergestellt wird.
Oder würrde mit $get[$i] überprüft ob die Variable tatsächlich von einem Skript auf kommt und wenn könnte ich ja die Variable von einem beliebigen Server abschicken?
Die Frage sollte oben beantwortet sein. :)
PS: Den Rest Zitat unten drunter hättest du auch löschen können.
- Sven Rautenberg
ss:) zu:) ls:[ fo:} de:] va:) ch:] sh:) n4:# rl:| br:< js:| ie:( fl:( mo:|