Michi: Upload macht in einem best. Fall (IE 6) Probleme...

Hallo,

wir bauen seit längerer Zeit ein umfangreiches Portal auf, wozu u.a. ein Upload-Bereich für Grafiken in den Formaten JPG und GIF zählt.

Diese Upload-Funktion wurde zigfach in allen möglichen Variationen in den Browsern Firefox, IE und mehr oder weniger Opera getestet, ging bisher überall prima.

Nun kommt ein User, der den IE Version 6.0.3790.0 verwendet:

Er bekommt die Fehlermeldung, dass es sich um ein ungültiges Grafikformat handle, obwohl die Dateiendung .jpg lautet, es sich um ein gültiges JPG handelt UND der Upload mit der selben Datei (haben wir uns mal per Email schicken lassen) in allen unseren Testbrowsern funktioniert, inkl. IE 7.

Leider gibts hier keinen IE 6...

Kernteil der Format-Abfrage:

$size      = getimagesize ( $_FILES [ 'grafik' ] ['tmp_name'] );
     $grafik_breite  = $size [ 0 ];
     $grafik_hoehe  = $size [ 1 ];
     $grafik_typ   = $size [ 2 ];

if ( ! (
( ( ( $_FILES [ 'grafik' ] [ 'type' ] == 'image/jpeg' ) || ( $_FILES [ 'grafik' ] [ 'type' ] == 'image/pjpeg' ) ) && ( $grafik_typ == 2 ) )
                     ||
( ( $_FILES [ 'grafik' ] [ 'type' ] == 'image/gif' ) && ( $grafik_typ == 1 ) )
                  )
         )
{
             $fehlertext .= "&bull; Der Grafiktyp ist nicht zul&auml;ssig. Nur .JPG und .GIF erlaubt.<br>";
         }
else
{

...

}

Gruß Michi

  1. Hi,

    Er bekommt die Fehlermeldung, dass es sich um ein ungültiges Grafikformat handle, obwohl die Dateiendung .jpg lautet, es sich um ein gültiges JPG handelt UND der Upload mit der selben Datei (haben wir uns mal per Email schicken lassen) in allen unseren Testbrowsern funktioniert, inkl. IE 7.
    Leider gibts hier keinen IE 6...

    loggt die (mutmaßlich) verwendeten Browser sowie die von euch abgefragten Werte mit. Im übrigen ist eine vom Client getroffene Behauptung *niemals* vertrauenswürdig - ihr ermöglicht es derzeit, die Datei virus.exe als Grafik verwenden zu lassen.

    if ( ! (
    ( ( ( $_FILES [ 'grafik' ] [ 'type' ] == 'image/jpeg' ) || ( $_FILES [ 'grafik' ] [ 'type' ] == 'image/pjpeg' ) ) && ( $grafik_typ == 2 ) )
                         ||
    ( ( $_FILES [ 'grafik' ] [ 'type' ] == 'image/gif' ) && ( $grafik_typ == 1 ) )
                      )
             )

    Wenn ihr als Programmierer nach Bytes bezahlt werdet, dann habe ich einen Tipp für euch: Setzt auch in die konstanten Stringliterale zu Anfang und Ende noch Leerzeichen, und fügt die trim()-Funktion drum herum ein. Ansonsten solltet ihr euch mal ein paar Styleguides ansehen, wie man Codes lesbarer macht ...

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Guten Tach,

      ihr ermöglicht es derzeit, die Datei virus.exe
      als Grafik verwenden zu lassen.

      Unter welchen Umständen denn?

      virus.exe nehmen, als virus.jpg speichern und versuchen, hochzuladen?

      Hab ich grad nochmal in Firefox und IE probiert, da kommt jeweils die Fehlermeldung. (Warum sollte die gezeigte Abfrage da nicht greifen? Vielleicht meinst Du ja was anderes? Gehts um Exploits, wenn nicht mit GDI+ gepatcht wurde...? etc. )

      Gruß Michi

      1. Hi,

        Unter welchen Umständen denn?
        virus.exe nehmen, als virus.jpg speichern und versuchen, hochzuladen?
        Hab ich grad nochmal in Firefox und IE probiert,

        wenn es damit nicht klappt, dann schreibe Dir Deinen eigenen Client, der die von Dir gewünschten kompromittierenden Daten übermittelt. Hierzu benötigter Level der Programmierkunst: Scr1pT-k1dDi3.

        Warum sollte die gezeigte Abfrage da nicht greifen?

        Weil sie sich nach einem vom Client erzeugten MIME-Type richtet. Der Client hat die Möglichkeit, jede beliebige Datei mit jedem beliebigen MIME-Type zu versehen.

        Cheatah

        --
        X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
    2. Hallo,

      if ( ! (
      ( ( ( $_FILES [ 'grafik' ] [ 'type' ] == 'image/jpeg' ) || ( $_FILES [ 'grafik' ] [ 'type' ] == 'image/pjpeg' ) ) && ( $grafik_typ == 2 ) )
                           ||
      ( ( $_FILES [ 'grafik' ] [ 'type' ] == 'image/gif' ) && ( $grafik_typ == 1 ) )
                        )
               )

      Wenn ihr als Programmierer nach Bytes bezahlt werdet, dann habe ich einen Tipp für euch: Setzt auch in die konstanten Stringliterale zu Anfang und Ende noch Leerzeichen, und fügt die trim()-Funktion drum herum ein.

      netter Vorschlag, das würde den Zeichensalat vielleicht noch etwas beleben.

      Ansonsten solltet ihr euch mal ein paar Styleguides ansehen, wie man Codes lesbarer macht ...

      Ja. Günstig gesetzte Leerzeichen und/oder Zeilenumbrüche können die Lesbarkeit von Quelltexten kolossal verbessern. Hier wird aber (auch meiner Ansicht nach) durch Übertreibung genau das Gegenteil erreicht.

      Ciao,
       Martin

      PS: Michi, du solltest das Ergebnis von getimagesize() noch in deine Bewertung, ob eine gültige Grafikdatei vorliegt, einbeziehen. Dann hat auch virus.exe keine Chance mehr. ;-)

      --
      Ich stehe eigentlich gern früh auf.
      Außer morgens.