# sicher Dateitypen prüfen -> unmöglich?



## campari (18. November 2006)

Moin,

folgende Zeilen sieben Dateitypen aus: einmal nach Dateiendung, und einmal nach Mime-Typ:


```
$datend = $datendx['extension'];
$filetyp = $_FILES['bild']['type'];
	if (($datend != "png") XOR ($datend != "jpg") XOR ($datend != "jpeg") XOR ($datend != "gif") XOR ($datend != "tiff") XOR ($datend != "tif") XOR ($datend != "psd") XOR ($datend != "raw") XOR ($datend != "bmp")) {
		echo $ftyp;
	} else {
	if (($filetyp != "image/png") XOR ($filetyp != "image/jpg") XOR ($filetyp != "image/jpeg") XOR ($filetyp != "image/gif") XOR ($filetyp != "image/tiff") XOR ($filetyp != "image/tif") XOR ($filetyp != "application/octet-streampsd") XOR ($filetyp != "raw") XOR ($filetyp != "image/bmp")) {
		echo $ftyp;
	} else {
// bildverarbeitung
```


Der Mime-Typ wird ja abhängig vom Browser ausgegeben. Also muss ich nach sovielen Mime-Typen suchen wie Browser!...erm, ja ... Das ist doch sinnfrei. Wie kann man denn wohl noch einschränken, dass nur bestimmte Dateitypen hochgeladen werden?
Anbei: Finde meinen Code ziemlich verwurschtelt, kann man das auch kürzer oder "klarer" schreiben?

Grüsse
campari


----------



## Hirnhamster (18. November 2006)

Du könntest alle dateiendungen bzw. mime-types in ein array speichern un dann einfach mittels in_array prüfen, ob die entsprechende dateiendung gültig ist bzw nicht.


----------



## Gumbo (18. November 2006)

Prüfe einfach, ob du die (in diesem Fall) Grafiktypen mit PHP verarbeiten kannst. PHP unterstützt mittlerweile 16 unterschiedliche Grafikformate (siehe getimagesize()-Funktion). Die vom Benutzerprogramm gesendeten Daten (sowohl Dateiname als auch den darauf beruhenden Inhaltstyp) sind nicht verlässlich.


----------



## campari (18. November 2006)

Merkwürdigerweise wird der Mime-Typ angepasst, wenn ich die Datei umändere (?!)

Bsp :
Die Datei "test.zip" ergibt als mime: application/zip
Umbenannt in "test.png" kommt: image/jpeg

Das ist ja vollkommen witzlos dann.


Habs nun so gelöst, dass mit Bildbearbeitungsfunktion geprüft wird:


```
if (getimagesize("pic/$eigname")) {
		$getim=getimagesize("pic/$eigname");
		$typ=$getim[2]; 
		$width=$getim[0];
		$height=$getim[1];
	} else {
		echo $ftyp;
		$typ = "0";
	}
```


----------



## Gumbo (18. November 2006)

Zumindest unter Windows ist der Inhaltstyp von der Dateierweiterung abhängig. Der Internet Explorer etwa holt sich diese Informatione beispielsweise aus dem Registry-Verzeichnis „HKEY_CLASSES_ROOT\MIME\Database\Content Type“ (vgl. Handling MIME Types in Internet Explorer).
Wie das bei anderen Betriebssystemen aussieht, kann ich leider nicht sagen.


----------



## Mairhofer (18. November 2006)

Hallo,

wie wäre es unter Linux mit


```
<?php
passthru("/usr/bin/file /pfad/zur/datei/dateiname.extension", $a);
echo $a;
?>
```
Habe es getestet und eine PNG datei nach .tar umbenannt, auch hier wurde mir der korrekte Dateityp angezeigt. Interessant wäre zu wissen, wie sich diese Methode verhällt, wenn man .exe dateien in Bilder "versteckt" (wie bei Loveletter Virus). Hat da jemand Erfahrung oder eine Möglichkeit das zu testen

[EDIT] >> Ok,habe erfahren das file nur die ersten 8Bit liesst. Daher keine Chance das zu erkenne.

Gruss


----------



## Matthias Reitinger (18. November 2006)

Hallo,



Mairhofer hat gesagt.:


> [EDIT] >> Ok,habe erfahren das file nur die ersten 8Bit liesst. Daher keine Chance das zu erkenne.


Das ist so nicht richtig. Es reicht nur in den seltensten Fällen aus, das erste Byte der Datei zu untersuchen. file verwendet vielmehr eine Heuristik zum Feststellen des Dateityps, welche auf die Informationen einer sogenannten magic-Datei (meist zu finden unter /usr/share/misc/file/magic) zurückgreift. In dieser sind Schemata zum Erkennen von Dateitypen und zum Auswerten weiterer Metainformationen hierzu enthalten. Trifft keines dieser Schemata auf eine untersuchte Datei zu, wird schlussendlich noch versucht, über eine Analyse der auftretenden Zeichen zu ermitteln, ob es sich um eine Text- oder Binärdatendatei handelt.

Dieses Verfahren liefert zwar oft das richtige Ergebnis, ist allerdings auch nicht gefeit vor mutwilliger Manipulation, vor allem wenn man den Inhalt der magic-Datei kennt. So wird beispielsweise auf meinem Debiansystem jede Datei, die mit BM anfängt, als „PC bitmap data“ identifiziert.

Grüße,
 Matthias


----------

