Sven Rautenberg: gd lib problem

Beitrag lesen

Moin!

ich habe jetzt den code der thumb.php mit

$image = $HTTP_GET_VARS[image];

erweitert.

Das ist im Prinzip in die richtige Richtung gedacht. Nur einen Schritt zu kurz. PHP hat seit eh (also mindestens Version 3.x) die $HTTP_*_VARS-Variablen, in denen die Daten des Requests drinstehen (für * kann man GET, POST, COOKIES, FILES, ENV und SERVER einsetzen).

Seit PHP Version 4.1 hat sich hier was geändert, und man kann $_* nehmen. Der Zugriff auf diese neuen Variablen ist von überall, auch aus Funktionen heraus, ohne "global $_*" möglich.

Nimm also, wenn du PHP ab Version 4.1 einsetzt, einfach $_GET, um an URL-Parameter heranzukommen.

aber es klappt immer noch nicht...

der fehler jetzt:

[Wed Feb 18 19:55:32 2004] [error] PHP Notice: Use of undefined constant image - assumed 'image' in /home/xy/public_html/test/thumb.php on line 4

Sehr schön, bei dir sind Notices eingeschaltet. Die zwingen dich, wirklich sauber zu programmieren, und sie sind auch bei Fehlern eine große Hilfe.

Das Problem ist schlicht deine Zugriffsform. Du willst in $_GET, welches ein Array ist, das Element mit dem namen "image" haben.

Preisfrage: Wie gibt man in PHP einen konstanten String an, beispielsweise, um ihn als Text mit echo auszugeben? Genau, man setzt ihn in Anführungszeichen.

Während du dies bei
echo "Image";
wie selbstverständlich tust, läßt du es bei $_GET[image] wie selbstverständlich weg. Warum?

$_GET['image'] oder $_GET["image"] ist richtig. 'image' ist ein String mit dem Namen des URL-Parameters.

image (ohne Anführungszeichen) hingegen _kann_ eine definierte Konstante sein. Und wenn das keine definierte Konstante ist, dann weist PHP freundlich darauf hin, und setzt als kleinen Service statt der unbekannten Konstante einfach den Namen der Konstante als String ein.

aber warum $image nicht definiert ist, verstehe ich nicht.

Weil bei dir register_globals auf off sind. Es ist der erste und tödlichste Fehler von PHP-Anfängern, dass sie glauben, alles, was sie in der URL als "var1=x&var2=y" übergeben, erscheint wie gottgegeben im Skript als $var1 und $var2. Dem ist nicht so, und man kann sich auf diese Weise herrlich weitreichende Sicherheitslücken einbauen.

Dass register_globals also ausgeschaltet ist, ist erstens zu deinem eigenen Schutz und zweitens sowieso die empfohlene Standardeinstellung für alle PHP-Versionen. Besser, du gewöhnst dich dran - so riesig ist die Umstellung auf $_GET, $_POST, $_FILES, $_COOKIES, $_ENV und $_SERVER ja nun nicht.

- Sven Rautenberg

--
"Habe den Mut, dich deines eigenen Verstandes zu bedienen!" (Immanuel Kant)