PHP Upload: Auf Dateityp prüfen?
-
hi alle
mich würde speziell interessieren ob eine datei die durch ein formular und php hochgeladen wurde, vom dateityp der zugelassenen typen stammt. wie genau kann man sowas bewerkstelligen das es auch einigermassen sicher ist? reicht für sowas strpos()? fände ich ja nicht so unsicher zumal das_ist_ein_test.gif_und_so_weiter.exe als GIF erkennt wird aber es sich doch um eine anwendung handelt. wie genau kann man sowas auf die schnelle sicher erkennen?
-
ups, unsicher sollte natürlich sicher heissen
und wenn ich schon dabei bin, der MIME typ bringt mir vielleicht bei bildern etwas aber bei zip dokumenten eher nicht da dort wie bei exe etc. wahrscheinlich application/octet-stream raus kommt.
-
getimagesize() liefert ein Array:
Index 2 is one of the IMAGETYPE_XXX constants indicating the type of the image.
http://de3.php.net/manual/en/function.getimagesize.php
...falls es dir um Bilder geht.
-
Hallo,
"auf die Schnelle" kannst du so etwas nicht erkennen. Streng genommen, kannst du so etwas technisch eigentlich überhaupt nicht erkennen (außer du baust nen Reader für das Dateiformat und prüfst, ob der beim öffnen ungültigen Content feststellt).
Wenn du nur "Quick'n'Dirty" die Dateiendung prüfen willst, müsste so etwas gehen:
$fileExtension = substr($fileName, strpos('.', $fileName));
Das würde dir aus "das_ist_ein_test.gif_und_so_weiter.exe" die Dateierweiterung ".gif_und_so_weiter.exe" machen, die ja relativ eindeutig ungleich dem erlaubten ".gif" ist.
Beachte aber, dass das nur die Dateiendung ist! Ob die Datei tatsächlich eine gültige Datei des gewünschten Formats ist, ist damit nicht sicher gestellt! Eine solche Prüfung wäre nur wie ganz am Anfang von mir genannt möglich - und mit PHP vermutlich kaum bis sehr schwer zu realisieren. Besonders bei Archiven musst du sehr vorsichtig dahergehen, und sie auf keinen Fall leichtsinnig entpacken! Ein Zip-Archiv, dass eine Milliarde Mal den gleichen Buchstaben enthält, kann komprimiert nur wenige Kilobytes groß sein; entpackst du die Datei jedoch, entstehen z.T. Gigabytegroße Datenmüllklötze!
Beachte außerdem, dass die oben genannte Variante (substr(...)) nicht mit unicodeformartierten Strings funktioniert! Außerdem solltest du den String unbedingt auf ein Vorkommen des Nullbyte-Characers prüfen (0x00), da die C-Routinen von PHP den String sonst an einer solchen Stelle als beendet betrachten könnten. (einTest.gif%00_und_so_weiter.exe könnte dir .gif als Dateiendung extrahieren).
-
Den Dateityp von Bildern kannst du relativ zuverlässig mit der Funktion exif_imagetype überprüfen.
Für andere Formate musst du um sicher zu gehen wohl oder übel den Headerbereich der Datei analysieren. Du brauchst z.B. eine ZIP-Datei nicht entpacken um festzustellen ob es eine solche ist!
Allerdings gibt es eine Menge verschiedener ZIP-Formate.
Beim "normalen" ZIP von PKware entsprechen, wenn ich mich nicht täusche, die ersten 2 Bytes immer "PK".
function isValidZipFile($file) { $fp = fopen($file, "r"); $bytes = fread($fp,2); fclose($fp); if($bytes == "PK") { echo $file . " ist wahrscheinlich eine ZIP-Datei"; } else { echo $file . " ist keine gültige ZIP-Datei."; } }