[PHP] Erkennen ob ein Bild ist

scriper

Eta Capricorni
ID: 57943
L
3 Mai 2006
2.721
316
Hallo!

Ich hab ein kleines Problem mit einem Script:

Ich möchte mittels Formularfeld eine Grafikdatei hochladen.

Mit PHP möchte ich nun prüfen, ob die Datei auch wirklich eine Grafikdatei ist.

Die Methode mit getimagesize() funktioniert irgendwie nicht richtig, da ich eine Fehlermeldung von meinem Script erhalte - bei Dateien die Windows aber als JPEG-Bild einstuft.

Hab da zB die Standard-Hintergrundbilder im Ordner Eigene Bilder verwendet.

Selbes Problem wenn ich den Mime-Typen abfrage (sowohl bei image/jpeg als auch image/pjpeg).

Kennt jemand ne Lösung?

MfG,
Scriper
 
Die Methode mit getimagesize() funktioniert irgendwie nicht richtig, da ich eine Fehlermeldung von meinem Script erhalte - bei Dateien die Windows aber als JPEG-Bild einstuft.
Das hatten wir schon mal. (evtl. mal Suche anwerfen)

getimagesize() ermittelt nicht, ob das für Billy's Betriebssystem ein JPEG-Bild ist, sondern ob es wirklich ein JPEG-Bild ist ;)
 
du must den check auf
PHP:
$_FILES['FELDNAME']['type']
machen

ich mache es zB so

PHP:
preg_match("/^image/i", $_FILES['Upfile']['type']

oder

PHP:
preg_match("/^audio/i", $_FILES['Upfile']['type']
 
du must den check auf
PHP:
$_FILES['FELDNAME']['type']
machen

ich mache es zB so

PHP:
preg_match("/^image/i", $_FILES['Upfile']['type']

oder

PHP:
preg_match("/^audio/i", $_FILES['Upfile']['type']

Wenn man eine ausführbare Datei in .jpg umbenennt, dann erhält diese Datei auch den Type image/jpeg, aber es ist noch lange kein Bild... Dieses Type ist total überflüssig.

Die einzige halbwegs sichere Überprüfung geht nur über die ersten gesetzten Bytes.
 
Wenn man eine ausführbare Datei in .jpg umbenennt, dann erhält diese Datei auch den Type image/jpeg, aber es ist noch lange kein Bild... Dieses Type ist total überflüssig.

Die einzige halbwegs sichere Überprüfung geht nur über die ersten gesetzten Bytes.

sicher?

Und wie soll man es dann machen?

@strolch00: so kommt der selbe fehler....aber die überprüfung klappt ja zB. auch bei myimg.de - obwohl es ja wohl kein "richtiges" jpeg ist...
 
ganz ehrlich?
getimagesize() ist komplett ausreichend, die ersten bytes auslesen, huhu, das wird wieder komplex, für jedes format der png gifs etc^^
ich weiß zwar net was windows mit den stard-bildern falsch gemacht hat, aber alle anderen bilder die man sonst hat klappen doch über die methode, also ich hatte da noch nie ein problem mit
 
PHP:
print_r(getimagesize("C:\Dokumente und Einstellungen\All Users\Dokumente\Eigene Bilder\Beispielbilder\Blaue Berge.jpg"));

ergibt:

Code:
Array
(
    [0] => 800
    [1] => 600
    [2] => 2
    [3] => width="800" height="600"
    [bits] => 8
    [channels] => 3
    [mime] => image/jpeg
)


wo ist das Problem :?::?::?:
 
der fehler kommt ja auch nur bei 2 der 4 Standard-Bilder...mom ich schau grad mal...

Edit:
Versuch mal die Datei Wasserlilien.jpg, die funzt bei mir net...
 
Zuletzt bearbeitet:
Huhu!

So gehts bei mir auch...

PHP:
print_r(getimagesize("C:\Dokumente und Einstellungen\All Users\Dokumente\Eigene Bilder\Beispielbilder\Blaue Berge.jpg"));
ergibt:

wenn ich die Datei aber direkt hochlade:
PHP:
print_r(getimagesize($_FILES['file']['tmp_name']));

dann kommt keine Ausgabe, zumindest bei zweien der 4 Bilder...

Ich weiß echt nicht woran das liegen kann...
 
versuch doch mal herauszufinden WELCHE dateien er nicht hochlädt, und frag mal deinen hoster ob vllt irgendwelche schutzsysteme da was blocken, hatte mal nen kunden, da hatte der hardend-php-patch teilw. uploads geblockt (ka wieso) bis ich da drauf gekommen bin^^
 
versuch doch mal herauszufinden WELCHE dateien er nicht hochlädt, und frag mal deinen hoster ob vllt irgendwelche schutzsysteme da was blocken, hatte mal nen kunden, da hatte der hardend-php-patch teilw. uploads geblockt (ka wieso) bis ich da drauf gekommen bin^^

momentan probier ich das mit meinem xampp...versuch das die Tage mal auf der Linuxkiste...denke aber nicht das es daran liegt.

Kann ja net sein das er 2 der 4 "Windows-Hintergrundbilder" hochläd, und die anderen net...
 
mhm

seltsam.

Unter Linux mit "richtigen" Servern funzt es auch nicht.

Hab das Problem nun auch bei anderen Grafiken gefunden.

Und selbst wenn ich bei den entsprechenden Grafiken $_FILES['file']['tmp_name'] ausgeben lasse, gibt er nichts aus.

Das heißt die Datei wurde nicht mal hochgeladen.

Mit der Serverkonfiguration scheint alles in Ordnung zu sein:
https://fi-eurobbw.de/blub/phpinfo.html
^^hab se mal als HTML abgespeichert.

Und nein, die Grafiken sind nicht größer als 2MB...

woran kann das nun liegen?

Nachtrag:

Momentan sieht meine Validierungs-Funktion so aus:

PHP:
function file_validate(){
    $error = array();
    /*if($_FILES['file']['size'] > 70000){
        $error[] = "Die Datei ist zu gro?!";
    }*/

    $types = array('image/gif', 'image/jpeg', 'image/png', 'image/pjpeg', 'image/x-png');
    if(!in_array($_FILES['file']['type'], $types)){
        $error[] = "Laden Sie nur Grafiken hoch!".$_FILES['file']['tmp_name'];
            
    }
    return $error;
    
}
 
wie ich schon einige beiträge vorher gesagt habe, ist die type-Eigenschaft eine optionale Eigenschaft und sollte daher NICHT verwendet werden (einige browser senden diese nicht mit).
Validier einfach über die Dateiendung, die Funktion getimage_size (oder so ähnlich) erkennt sehr genau ob es eines der genannten Bildformate ist oder überprüfe es anhand der Dateiendung, denn wenn jemand ne PHP-Datei hochlädt und diese aber als .gif speichert ist es doch egal, Schaden kann er nicht anrichten.

außerdem gibt es noch mehr mime-Type-Variantionen deiner genannten mime-Typen, mir ist auch schon ein image/jpg untergekommen, dann progressive gifs haben glaube ich auch nen andren mime-type etc