Kalle: Tipp: Fileupload mit PHP und Sicherheit

Hallöle,

bekomme eben von meinem Provider den monatlichen Newsletter. Den PHP- Tipp kopiere ich einfach mal hierher.

Lieben Gruß, Kalle.

Fileupload mit PHP und Sicherheit

In der Vergangenheit haben wir immer wieder Sicherheitsdefizite beim Upload mit PHP festgestellt. Um diese zu beseitigen geben wir Ihnen hier eine Beschreibung. Man kann ganz einfach prüfen, ob die hochgeladene Datei einem bestimmen MIME-Typ entspricht.

PHP-CODE:

if( $_FILES['userfile']['type'] == "image/jpeg" )
[...] //ok
else
[...] //Fehler

Es wird hier geprüft, ob die Datei (userfile) wirklich den MIME-Typ "image/jpeg" hat. Wenn nicht, könnte z.B. eine Fehlermeldung ausgegeben werden. Man könnte auch auf "image/gif" usw. prüfen.

Eine weitere Möglichkeit ist, einfach den Dateinamen der hochgeladenen Datei selbst zu prüfen.

Mit folgendem Code werden nur Dateien mit der Endung .jpg als "ok" angenommen:

if( preg_match("/.jpg$/", $_FILES['userfile']['name'] )
[...] //ok
else
[...] //Fehler

Das ".jpg" lässt sich durch jede beliebige Endung ersetzen. Das "$" muss allerdings bestehen bleiben, da dies sicherstellt, dass die gesuchte Erweiterung auch wirklich am Ende des Dateinamen steht.

Am besten ist eine Kombination aus beiden Prüfungen.

Weitere, wichtige Informationen finden sich unter: http://de2.php.net/features.file-upload

  1. hi,

    bekomme eben von meinem Provider den monatlichen Newsletter. Den PHP- Tipp kopiere ich einfach mal hierher.

    abgesehen davon, dass das urheberrechtliche probleme geben könnte: der tipp ist irgendwie, hm, mist.

    Man kann ganz einfach prüfen, ob die hochgeladene Datei einem bestimmen MIME-Typ entspricht.
    [...]
    if( $_FILES['userfile']['type'] == "image/jpeg" )
    [...]
    Es wird hier geprüft, ob die Datei (userfile) wirklich den MIME-Typ "image/jpeg" hat.

    tja, das nur gerade bei jpegs nicht alle browser den gleichen mime-type senden, scheint denen entgangen zu sein. der IE nutzt m.W. image/pjpeg oder sowas in der art.

    darüber hinaus muss der client ja auch nicht unbedingt ein vertrauneswürdiger sein - der kann dir auch gerne eine ausführbare datei mit image/jpeg oder auch wurgel/baldtot als mime-type schicken.

    gerade bei grafiken bietet es sich an, den typ stattdessen mittels getimagesize() zu überprüfen.

    Eine weitere Möglichkeit ist, einfach den Dateinamen der hochgeladenen Datei selbst zu prüfen.

    klar, und wenn ich auf einen VW käfer vorne einen dreizackigen stern in einem kreis draufmontiere, kann ich ihn als benz verkaufen ...

    Das ".jpg" lässt sich durch jede beliebige Endung ersetzen.

    ja, und das kann der client auch.

    gruß,
    wahsaga

    --
    "Look, that's why there's rules, understand? So that you _think_ before you break 'em."
    1. wie siehts eigentlich mit imagemagick aus..
      wenn nen user die möglichkeit nen bild hochzuladen und das original file dann mit imagemagick konvertiert, in ein anderes verzeichnis kopiert wird, und das original danach gelöscht wurde, dürfte doch eigentlich nix passieren oder?!

      denn wenn es sich nicht um ein gültiges format handelt, dürfte imagemagick dies doch auch nicht konvertieren..

      oder irre ich mich da jetzt?!?

    2. [url]http://aktuell.de.selfhtml.org/artikel/phpasp/php-uploadcheck/index.htm[/url]

      alt aber noch halbwegs richtig :-)

      Ludwig