Bildupload mit Typ-Beschränkung
Matze
- php
0 dr_vertigo0 Der Martin1 dr_vertigo0 Matze
0 Steel0 Pragma
Hallo!
Ich schreibe gerade an einem Formular zum Bilderupload.
Dabei prüfe ich den Typ der Datei auf "image".
Leider können die Browser aber nicht alle Bilder darstellen.
So dürften z.B. Datein der Art PSD als image erkannt aber nicht angezeigt werden. (hab keinen Photoshop zum testen)
Was meint ihr welche Dateitypen ich akzeptieren sollte?
Ich dachte jetzt zumindest an JPEG, GIF, PNG, BMP und TIF.
Oder werden PSD vllt. gar nicht als image erkannt?
Danke für eure Tipps!
Grüße, Matze
was heisst denn, du "prüfst auf image"? meinst du den mime-type (image/gif etc...)
Hi,
Ich schreibe gerade an einem Formular zum Bilderupload.
Dabei prüfe ich den Typ der Datei auf "image".
wie machst du das? Prüfst du den MIME-Typ, oder gar die Extension des Namens? - Das wären beides Angaben, die vom Client beliebig gesetzt sein können und daher nicht vertrauenswürdig sind.
Versuche stattdessen lieber, mit getimagesize() aus der gd-lib die Bildgröße zu bestimmen. Bei identifizierbaren Bildformaten (GIF, PNG, JPEG) kommen plausible Werte raus.
Leider können die Browser aber nicht alle Bilder darstellen.
Nein, natürlich nicht. Nur die schon erwähnten Bildformate sind im Internet wirklich mit hinreichender Sicherheit verwendbar. Windows-Browser dürften vielleicht noch BMP unterstützen, der Rest ist Glückssache.
So dürften z.B. Datein der Art PSD als image erkannt aber nicht angezeigt werden. (hab keinen Photoshop zum testen)
Erkannt? Kommt auf die Methode an. Mein Vorschlag mit der gd-lib würde das sicher nicht als Bild erkennen, und viele User könnten damit ebenfalls nichts anfangen.
Was meint ihr welche Dateitypen ich akzeptieren sollte?
Ich dachte jetzt zumindest an JPEG, GIF, PNG, BMP und TIF.
BMP und TIFF sind Glückssache.
Oder werden PSD vllt. gar nicht als image erkannt?
Nur von Photoshop oder anderen Grafikprogrammen, die ausdrücklich Photoshop-Dateien unterstützen.
Ciao,
Martin
Versuche stattdessen lieber, mit getimagesize() aus der gd-lib die Bildgröße zu bestimmen. Bei identifizierbaren Bildformaten (GIF, PNG, JPEG) kommen plausible Werte raus.
Das könnte gefährlich sein, sich nur auf die Ergebnisse von getimagesize zu verlassen, zumal es möglich ist, PHP valide etwa in PNG-Kommentare einzuschleusen.
Dann bedarf einer einfachen Local File Inclusion und schwupps ist der schädliche Code geparst...
Hallo,
Versuche stattdessen lieber, mit getimagesize() aus der gd-lib die Bildgröße zu bestimmen. Bei identifizierbaren Bildformaten (GIF, PNG, JPEG) kommen plausible Werte raus.
Das könnte gefährlich sein, sich nur auf die Ergebnisse von getimagesize zu verlassen, zumal es möglich ist, PHP valide etwa in PNG-Kommentare einzuschleusen.
Lass mich überlegen ...
1. Ich lade eine Datei mit der Extension "png" hoch. Die wird von getimagesize() als PNG-Grafik erkannt und akzeptiert. Wenn irgendein Client sie später wieder anfordert, wird sie als image/png ausgeliefert. "Niemand" wird PHP-Code interpretieren, der eventuell in den Meta-Daten steht. Der Server nicht, weil die Datei nicht auf ".php" endet, und der Client sowieso nicht, weil er kein PHP kennt.
2. Ich lade eine Datei mit der Extension "php" hoch, die einen gültigen PNG-Header hat, auf den aber irgendwo "<?php" und PHP-Code folgt. Dieser PHP-Code würde dann tatsächlich ausgeführt.
Okay, im Fall 2 hast du Recht. File Extensions, die auf dem Server eine bestimmte Spezialfunktion haben, müssen aus Sicherheitsgründen abgewiesen werden.
Dann bedarf einer einfachen Local File Inclusion
Das braucht's nicht einmal - der Schadcode kann direkt in der hochgeladenen Datei stehen.
Danke für deinen wertvollen und wichtigen Hinweis!
So long,
Martin
wie machst du das? Prüfst du den MIME-Typ, oder gar die Extension des Namens?
Versuche stattdessen lieber, mit getimagesize() aus der gd-lib die Bildgröße zu bestimmen. Bei identifizierbaren Bildformaten (GIF, PNG, JPEG) kommen plausible Werte raus.
Genau genommen teste ich beides. Also erst den MIME-Typen und wenn der stimmt nochmal mit getimagesize().
getimagesize() auch deshalb, weil die Bilddaten zusammen mit Daten des Uploads in einer Tabelle gespeichert werden.
Erkannt? Kommt auf die Methode an. Mein Vorschlag mit der gd-lib würde das sicher nicht als Bild erkennen, und viele User könnten damit ebenfalls nichts anfangen.
Ich war mir halt nicht sicher, ob PSD oder z.B. DDS oder sonstwas auch als Bilder erkannt werden.
Zu dem Vorschlag die Bilder auf dem Server zu verarbeiten:
Genau darum geht es mir letztendlich.
Ich hab kein Problem mit imagecreateby... aber da hätte ich wohl ein Problem mit propritären Formaten bekommen.
Ich überleg jetzt nur noch wie ich mit Alpha-Transparenten PNGs umgehe.
Da macht mir die Erhaltung der Transparenz beim bearbeiten immer Probleme ;(
Najam erstmal bis dahin schreiben... :)
Danke für eure Hinweise!
Grüße, Matze
Hallo,
wie machst du das? Prüfst du den MIME-Typ, oder gar die Extension des Namens?
Versuche stattdessen lieber, mit getimagesize() aus der gd-lib die Bildgröße zu bestimmen. Bei identifizierbaren Bildformaten (GIF, PNG, JPEG) kommen plausible Werte raus.
Genau genommen teste ich beides. Also erst den MIME-Typen und wenn der stimmt nochmal mit getimagesize().
Untersuche lieber den Dateinamen (bzw. dessen Extension) anstatt des MIME-Typs, der beim Upload nicht vertrauenswürdig ist. Sonst schiebt dir tatsächlich jemand ein manipuliertes Bild mit der Extension "php" unter, und du tappst in die von dr_vertigo beschriebene PHP-Falle.
getimagesize() auch deshalb, weil die Bilddaten zusammen mit Daten des Uploads in einer Tabelle gespeichert werden.
Dann speichere aber sicherheitshalber nicht den MIME-Typ, den dir der Client beim Upload mitgeteilt hat, sondern den, den getimagesize() anhand der Untersuchung tatsächlich herausgefunden hat.
Ich überleg jetzt nur noch wie ich mit Alpha-Transparenten PNGs umgehe.
Da macht mir die Erhaltung der Transparenz beim bearbeiten immer Probleme ;(
Lies mal die UCN zu imagecreatefrompng(), besonders den derzeit jüngsten Hinweis. Das könnte dir helfen, wenn du soweit bist.
Ciao,
Martin
Dann speichere aber sicherheitshalber nicht den MIME-Typ, den dir der Client beim Upload mitgeteilt hat, sondern den, den getimagesize() anhand der Untersuchung tatsächlich herausgefunden hat.
Genauso mach ich das :)
Lies mal die UCN zu imagecreatefrompng(), besonders den derzeit jüngsten Hinweis. Das könnte dir helfen, wenn du soweit bist.
Ich bin grad bisschen erschlagen von den PNG-Funktionen -.-
Ich bräuchte aber noch ein bisschen Hilfe beim erstellen des Bildes.
Genau genommen müsste ich die Größe des hochgeladenen Bildes nach dem Upload auf 150px Breite skalieren.
Dabei bin ich mir grad nicht sicher wie ich vorgehen muss.
Also die Daten des Bildes werden ausgelesen und in einer Tabelle gespeichert.
Danach wird das Bild mit move_uploaded_file() in ein entsprechendes Verzeichniss geschoben. Der Name wird aus der Tabellen-Id und dem ermittelten Format zusammengesetzt.
Jetzt habe ich meinen Code um die Bildgröße zu verändern aber ich weiß nicht wie ich die Original-Datei bearbeiten kann.
Muss ich dazu die Datei-Funktionen (fopen, fwrite, fclose) verwenden oder geht das irgendwie zusammen mit move_uploaded_file() in einem Abwasch?
Danke und Grüße, Matze
Hallo Martin!
Lies mal die UCN zu imagecreatefrompng(), besonders den derzeit jüngsten Hinweis. Das könnte dir helfen, wenn du soweit bist.
Nein, das hilft mir nicht weiter.
Sowohl bei PNGs als auch bei GIFs verlier ich die Transparenz :(
Bei den PNGs bin ich es ja gewohnt, aber ich dachte, dass wenigstens GIFs vernünftig verarbeitet werden.
Ist es mit PHP überhaupt möglich ein transparentes Bild unter Beibehaltung der Transparenz zu skalieren?
Danke und Grüße, Matze
Ist es mit PHP überhaupt möglich ein transparentes Bild unter Beibehaltung der Transparenz zu skalieren?
Also mit der hier vorgeschlagenen Funktion bekomme ich die GIFs schön transparent.
Im Beispiel für die Funktion kommt allerdings ein PNG zum Einsatz welches bei mir weiterhin nicht transparent ist, sondern einen schwarzen Hintergrund bekommt :(
Hätte noch jemand einen Vorschlag?
Bei den PNGs bin ich echt am verzweifeln.
Danke und Grüße, Matze
Entschuldigt bitte, die Funktion funktioniert super!
Ich hatte woanders einen Fehler.
Danke für alle Tipps und Hilfe!
Grüße Matze
Hi!
Oder werden PSD vllt. gar nicht als image erkannt?
Woher? Das ist ein proprietaeres Format fuer Photoshop und kompatible. Wie Martin schon erklaert hat. Was ist mit dds-Dateien? Ich hab ne Menge Grafiken in dds-Dateien. Wenn ich die mal jemandem zum ansehen schicke, muss ich sie immer umwandeln, weil "normale" Systeme dieses Format nicht kennen. Jetzt wuerde es fuer meine Zwecke durchaus Sinn machen, wenn mir jemand solche Dateien auf meinen Webspace laedt. Problem: Woher weiss das System, dass es eine Grafik ist? Weiss es nicht. Ich werd aber sicher keine php Erweiterung schreiben.
Beschraenke dich vernuenftigerweise doch auf die einfachen, weit verbreiteten Formate GIF, JPEG und PNG.
Ich schreibe gerade an einem Formular zum Bilderupload.
Leider können die Browser aber nicht alle Bilder darstellen.
Ich dachte jetzt zumindest an JPEG, GIF, PNG, BMP und TIF.
Auch bei einem jpg kann es dir passieren, dass es in machen Browsern nicht dargestellt werden kann(z.b. wenn es im CMYK Farbraum vorliegt). Mein pragmatischer Ansatz lautet:
Lass den User hochladen, wass er will und jage es durch eine serverseitige Bildbearbeitung (imho ist ImageMagick eine sehr gute Wahl) um das eigentlich anzuzeigende Bild zu erzeugen. Hierbei gehört eine Fehlerbehandlung implementiert, um dem User sagen zu können: Sorry, Bildformat leider nicht unterstützt.