Angua: Dateiformats-Kontrolle

In einem Uploadformular möchte ich sichergehen, dass nur jpg-Dateien hochgeladen werden können.
Zur Überprüfung verwendete ich folgenden Code:

$imagesize = getimagesize($_FILES['theimage']['tmp_name']);
If ($imagesize[2] == 2 && $_FILES['theimage']['type'] == "image/jpeg") {
*weiter im script*
}
else {
$fehlermeldung1 = TRUE;
}

Bei mir selbst funktioniert es einwandfrei, korrekte Bilder werden hochgeladen, falsche Dateien abgelehnt.

Bei den meisten Usern die dieses Formular verwenden klappt ebenfalls alles.
Jetzt haben mich aber schon zwei User darauf angesprochen, dass der Upload nicht funktioniert und die oben mögliche Fehlermeldung ausgegeben wird.

Wenn diese User mir nun die Datei auf andere Weise zuschicken und ich sie selbst hochlade, gibt es bei mir keine Schwierigkeiten, sie scheint also korrekt zu sein.

Hat jemand eine Idee wie es passieren kann, dass es bei manchen Usern besagte Probleme gibt? Gibt es eine Möglichkeit, dass diese Prüfung auch bei echten jpg-Bildern falschen Alarm schlägt?

Gruß Angua

  1. Hello,

    In einem Uploadformular möchte ich sichergehen, dass nur jpg-Dateien hochgeladen werden können.
    Zur Überprüfung verwendete ich folgenden Code:

    $imagesize = getimagesize($_FILES['theimage']['tmp_name']);
    If ($imagesize[2] == 2 && $_FILES['theimage']['type'] == "image/jpeg") {
    *weiter im script*
    }
    else {
    $fehlermeldung1 = TRUE;
    }

    Bei mir selbst funktioniert es einwandfrei, korrekte Bilder werden hochgeladen, falsche Dateien abgelehnt.

    Bei den meisten Usern die dieses Formular verwenden klappt ebenfalls alles.
    Jetzt haben mich aber schon zwei User darauf angesprochen, dass der Upload nicht funktioniert und die oben mögliche Fehlermeldung ausgegeben wird.

    Wenn diese User mir nun die Datei auf andere Weise zuschicken und ich sie selbst hochlade, gibt es bei mir keine Schwierigkeiten, sie scheint also korrekt zu sein.

    Hat jemand eine Idee wie es passieren kann, dass es bei manchen Usern besagte Probleme gibt? Gibt es eine Möglichkeit, dass diese Prüfung auch bei echten jpg-Bildern falschen Alarm schlägt?

    Kleines Denkspiel zum Auftakt:

    Wäre es trotzdem noch möglich, JPG-Dateien mit der Endung *.php hochzuladen?
    Die Funktion getimagesize() interessiert sich gar nicht für den Namen und die Endung der Datei.

    siehe http://wiki.selfhtml.org/wiki/Artikel:PHP/File_Upload
    Der Artikel ist zwar lange noch nicht fertig, aber es sollte schon daraus hervorgehen, dass Fileuploads die schlimmsten Sicherheitslücken hervorrufen können.

    Lässt sich das nachvollziehen mit den beiden Usern?
    Dann baue für sie ein Testscript, dass ihnen neben der Fehlermeldung auch den Rückgabewert der Funktion getimagesize() und den Inhalt von $_FILES['theimage']['type'] anzeigt und bitte sie, Dir diese Ergebnisse per Copy & Paste per eMail zuzusenden.

    Vergiss bei der Anzeige in der Webseite nicht, htmlspecialchars() anzuwenden
    siehe http://wiki.selfhtml.org/wiki/Artikel:Kontextwechsel

    Ich vermute, dass es mit der Groß-/Kleinschreibung zu tun hat, oder dass der Client versehentlich den Typ "image/jpg" meldet. Der Clientangabe solltest Du sowieso nicht vertrauen. Die ist beliebig fälschbar.

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
    1. Kleines Denkspiel zum Auftakt:

      Wäre es trotzdem noch möglich, JPG-Dateien mit der Endung *.php hochzuladen?

      Kann eine Datei mit ausführbarem php Code so gestaltet sein, dass sie eine korrekte Bildhöhe und -breite ausgibt, wenn das mit getimagesize() geprüft wird?
      Wenn nein sollte das keine Sicherheitslücke bedeuten, da diese Werte ebenfalls kontrolliert werden.
      Man könnte vielleicht ein Bild in .php umbenennen und es "durchschmuggeln", aber ich sehe nicht wie das dann Schaden anrichten könnte.

      Lässt sich das nachvollziehen mit den beiden Usern?
      Dann baue für sie ein Testscript, dass ihnen neben der Fehlermeldung auch den Rückgabewert der Funktion getimagesize() und den Inhalt von $_FILES['theimage']['type'] anzeigt und bitte sie, Dir diese Ergebnisse per Copy & Paste per eMail zuzusenden.

      Vergiss bei der Anzeige in der Webseite nicht, htmlspecialchars() anzuwenden
      siehe http://wiki.selfhtml.org/wiki/Artikel:Kontextwechsel

      In welchem Sinne kann das Weglassen da eigentlich gefährlich sein? Könnten dann z.B. eine iframes eingefügt werden?

      Ich vermute, dass es mit der Groß-/Kleinschreibung zu tun hat, oder dass der Client versehentlich den Typ "image/jpg" meldet. Der Clientangabe solltest Du sowieso nicht vertrauen. Die ist beliebig fälschbar.

      Ok das werd ich mal prüfen. Danke schon soweit.

      1. Hello,

        Kleines Denkspiel zum Auftakt:

        Wäre es trotzdem noch möglich, JPG-Dateien mit der Endung *.php hochzuladen?

        Kann eine Datei mit ausführbarem php Code so gestaltet sein, dass sie eine korrekte Bildhöhe und -breite ausgibt, wenn das mit getimagesize() geprüft wird?

        Ja.

        Wenn nein sollte das keine Sicherheitslücke bedeuten, da diese Werte ebenfalls kontrolliert werden.

        Es ist aber so, dass gerade bei JPG-Dateien im Exif-Header eine fast beliebige Menge Code untergebracht werden kann, die auch ausgeführt wird, wenn die Datei geparst wird. Die Datei muss für diesen Zweck "bearbeitet" worden sein, was aber möglich ist.

        Man könnte vielleicht ein Bild in .php umbenennen und es "durchschmuggeln", aber ich sehe nicht wie das dann Schaden anrichten könnte.

        Das darin enthaltene Script würde, wenn das Bild direkt per HTTP erreicht würde und damit vermútlich im Bereich der zu parsenden Dateien liegt, ausgeführt werden.

        Vergiss bei der Anzeige in der Webseite nicht, htmlspecialchars() anzuwenden
        siehe http://wiki.selfhtml.org/wiki/Artikel:Kontextwechsel

        In welchem Sinne kann das Weglassen da eigentlich gefährlich sein? Könnten dann z.B. eine iframes eingefügt werden?

        Bitte erst den Artikel von Dedlfix lesen.

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
         ☻_
        /▌
        / \ Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
  2. Hi,

    If ($imagesize[2] == 2 && $_FILES['theimage']['type'] == "image/jpeg") {

    Jetzt haben mich aber schon zwei User darauf angesprochen, dass der Upload nicht funktioniert und die oben mögliche Fehlermeldung ausgegeben wird.

    Dann verwenden die vermutlich einen IE, der nicht image/jpeg als Mimetype sendet.

    Hat jemand eine Idee wie es passieren kann, dass es bei manchen Usern besagte Probleme gibt?

    http://www.google.com/search?q=ie+mimetype+image/jpeg

    MfG ChrisB

    --
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?