she3p
0
Guten Morgen.
Seit längerem nun steh ich vor dem Problem einer sauberen MimeType-Überprüfung in PHP. Das Problem dabei ist nicht die fehlende Funktionalität in PHP, sondern verschiedene unglückliche Parameter.
Zum einen fehlt auf der von mir zu gebrauchenden Serverinstallation (Windows) das sogenannte "magic"-File.
Somit fällt die Funktion
weg, da gemäss Manual die MimeTypes per magic.mime eruiert werden.
Weiter gäbe es ja die in PHP6 standardmässig gebrauchte Klasse Fileinfo und die dementsprechenden fifo-funktionen welche allerdings auf meiner
PHP-Installation nicht zur Verfügung steht.
Womit diese Option auch wegfällt.
Nun weitere sichere (und in PHP integrierte) Möglichkeiten gibt es m.E. nicht, oder seh ich das falsch? Die meisten weiteren Contributions im Netz drehen sich nur um die Analysation der file-extension.
Zu erwähnen wäre vielleicht, dass ich keine system() / exec() absetzten kann & auch nicht will.
Also hab ich mich drangemacht selbst eine kleine Lösung zu schreiben, mit welcher ich allerdings nicht ganz zufrieden bin.
Prinzipiell ist es nur eine weitere Integration des magic.mime, aber seht selbst.
für eine .exe kriege ich zum Beispiel ein $matches-Array wie das folgende
Das erste Element ist nun das Entscheidende. Im magic-File nun nach MZ gesucht findet man das folgende
Eine exe als octet-stream zu deklarieren ist richtig, also dürfte die Evaluation stimmen. (Auch für weitere Dateien getestet)
magic beinhaltet teilweise auch byte-Überprüfungen wie die folgende:
Meines Erachtens lässt sich dies mit PHP nicht überprüfen, oder irre ich mich da?
Auch gibt es Dateien (zB ein normales Textfile), welches mit dieser Methode nicht analysiert werden kann, da es bereits einen text/plain header besitzt und mir somit die wirkliche erste Zeile ausgibt. (Welche mit Sicherheit matcht )
Zum anderen ist das magic-file 935 Zeilen schwer, was einen nicht zu übergehenden Aufwand für die Integration bedeuten würde
Nun, kennt ihr weitere Möglichkeiten einen MimeType eines Files sicher zu finden? Oder sollte ich mich an dieser Lösung austoben?
(Bzw: auf PHP6 warten )
PS: Mein Code ist nur ein POC, RegEx ist nicht ausgereift und keine Überprüfungen gemacht, sollte aber für die Idee reichen.
Seit längerem nun steh ich vor dem Problem einer sauberen MimeType-Überprüfung in PHP. Das Problem dabei ist nicht die fehlende Funktionalität in PHP, sondern verschiedene unglückliche Parameter.
Zum einen fehlt auf der von mir zu gebrauchenden Serverinstallation (Windows) das sogenannte "magic"-File.
Somit fällt die Funktion
PHP:
mime_content_type()
Code:
Returns the MIME content type for a file as determined by using information from the magic.mime file.
PHP-Installation nicht zur Verfügung steht.
Womit diese Option auch wegfällt.
Nun weitere sichere (und in PHP integrierte) Möglichkeiten gibt es m.E. nicht, oder seh ich das falsch? Die meisten weiteren Contributions im Netz drehen sich nur um die Analysation der file-extension.
Zu erwähnen wäre vielleicht, dass ich keine system() / exec() absetzten kann & auch nicht will.
Also hab ich mich drangemacht selbst eine kleine Lösung zu schreiben, mit welcher ich allerdings nicht ganz zufrieden bin.
Prinzipiell ist es nur eine weitere Integration des magic.mime, aber seht selbst.
PHP:
<?php
$file = 'yourfile.ext';
$handle = fopen ($file, "r");
$buffer = fgets($handle); //just the first line (no loop is needed)
fclose ($handle);
$matches = array();
preg_match_all('/[A-Za-z0-9,.-\/]+/', $buffer, $matches);
// show $matches
?>
Code:
array(1) {
[0]=>
array(10) {
[0]=>
string(2) "MZ"
[1]=>
string(1) "L"
[2]=>
string(4) "This"
[3]=>
string(7) "program"
[4]=>
string(6) "cannot"
[5]=>
string(2) "be"
[6]=>
string(3) "run"
[7]=>
string(2) "in"
[8]=>
string(3) "DOS"
[9]=>
string(5) "mode."
}
}
Code:
sheeep@foobar:~$ cat /etc/apache2/magic | grep MZ
0 string MZ application/x-dosexec
0 string MZ
0 string MZ
0 string MZ
0 string MZ
0 string MZ application/octet-stream
magic beinhaltet teilweise auch byte-Überprüfungen wie die folgende:
Code:
>43 byte 0x14 application/ichitaro4
Auch gibt es Dateien (zB ein normales Textfile), welches mit dieser Methode nicht analysiert werden kann, da es bereits einen text/plain header besitzt und mir somit die wirkliche erste Zeile ausgibt. (Welche mit Sicherheit matcht )
Zum anderen ist das magic-file 935 Zeilen schwer, was einen nicht zu übergehenden Aufwand für die Integration bedeuten würde
Nun, kennt ihr weitere Möglichkeiten einen MimeType eines Files sicher zu finden? Oder sollte ich mich an dieser Lösung austoben?
(Bzw: auf PHP6 warten )
PS: Mein Code ist nur ein POC, RegEx ist nicht ausgereift und keine Überprüfungen gemacht, sollte aber für die Idee reichen.
Zuletzt bearbeitet: