dedlfix: Neuer Anlauf

Beitrag lesen

Tach!

if (isset ($_GET['Bild']) && $_GET['Bild'] !== "")
      {

Du hast mich nicht richtig verstanden. Diese beiden Abfragen lassen sich mit empty() zusammenfassen. (Zudem wäre der typsichere Vergleich bei $_GET/$_POST nicht sinnvoll, weil sowieso nur Strings dort drinstehen.) Das empty() hatte ich an der Stelle eigentlich nur zur zusätzlichen Information aufgeführt. Mein Vorschlag hier war jedoch, (nur) das isset() zu lassen und dazu den korrigierten RegExp als eine Art Dateinamensprüfung. Diese sollte zumindest verhindern, dass anderswohin als ins vorgesehene Verzeichnis gegriffen werden kann. Das Ausschließen von . ist da schon ein Anfang.

$Bild = "../GRAFIKEN/SORTIMENT/" . $_GET['Bild'] . ".png";
         if (file_exists ($Bild))

Ohne den RegExp prüfst du jetzt nur, ob es eine Datei ist. Die kann sich aber aufgrund von ../-Teilen im Parameter irgendwo befinden. Damit kann man zumindest unberechtigt Grafikdateien zur Ausgabe bringen.

Die Prüfung sollte also sicherstellen, dass $_GET['Bild'] vorhanden ist, mit dem RegExp, dass es nicht leer und nur Buchstaben/Zahlen enthalten sind, und dass das Ergebnis auf eine Datei zeigt.

if (isset ($_GET['Breite']) && $_GET['Breite'] !== "")
            {
               if  (is_numeric ($_GET['Breite']))

Hier und bei der Höhe kannst du zu if (!empty(...) and is_numeric(...)) zusammenfassen. Bei Höhe jedoch ifelse und das else danach bringt die Fehlermeldung. Allerdings ist die Fehlermeldung nur zum Debugging sinnvoll, denn normalerweise wird das Script ja von <img> aufgerufen, und dann sind keine Textausgaben zu sehen.

$Bild = $Thumbnail;
      imagepng ($Bild, "", 9);

Das Umkopieren ist überflüssig. Lass das weg und übergib dem imagepng() gleich $Thumbnail.

Ist das mit dem Erhalt der vormaligen Transparenz kompliziert?

Kann ich dir nicht beantworten.

Nebenbei: wenn ich, so wie Chris es vorgeschlagen hatte, das "&" escape und statt dessen "&amp;" schreibe, dann läuft mir das Skript bei der Abfrage nach Breite und Höhe in den finalen else-Zweig und spuckt mir meine Fehlermeldung aus, dass Breite oder Höhe nicht angegeben wurden.

Das &amp; darf nur im HTML-Kontext angewendet werden. Die Eingabezeile des Browsers ist kein HTML, also wäre das dort fehl am Platz.

Was jetzt aber noch nicht funktioniert, ist die Einbindung in den bestehenden HTML-Code mittels $Ausgabe .= '<img src="Verkleinern.php?Bild=' . $Bild . '&Hoehe=95">';
Liegt es daran, dass ich keine Größenangaben hinterlegt habe?
Wieso klappt die direkte Eingabe im Browser, nicht aber die Ausgabe innerhalb des HTML-Codes?

Das vermag ich jetzt nicht zu erkennen. Ersetz doch mal alle echo durch file_put_contents('error.log', 'hierdiemeldung', FILE_APPEND); Das error.log soll in ein Verzeichnis zeigen, in das der Webprozess schreiben darf. Am besten wäre außerhalb des DocumentRoot. Jedenfalls solltest du nun nachträglich sehen, was dein Script gemacht hat, wenn es eingebunden ist. Zusätzliche Kontrollausgaben dorthin wären im weiteren Verlauf des Debuggings sinnvoll.

dedlfix.