das Nutzereingaben in Formularen immer misstraut werden sollte, ist klar. Die bei Texteingaben, Checkboxen usw. ja noch rel. einfache Prüfung ist bei Dateianhängen dann schon was komplizierter.
Ich brauche da mal eure Ideen. "Anstoß" ist dabei dieses - nicht ganz neue aber gerade wieder auftauchende - Szenario mit Evil-Jpegs: http://www.golem.de/news/evil-jpegs-fot ... 13625.html Das Ganze würde ich hier gerne mal ganz allgemein angehen ohne direkt mit diesem "Detailfall" loszulegen.
Es gibt also zwei Szenarien:
a) Datei wird nur gemailt.
b) Datei wird zusätzlich auf dem Webserver hinterlegt.
1) Dateiendung
Wenn ich einen Dateianhang in einem Formular erlaube, kann ich vor dem Absenden natürlich auf die Dateiendung prüfen. Das das nicht wirklich was bringt, kennen wir ja alle von den üblichen Spamanhängen.
2) Mime-Type
Statt jetzt auf die .xyz zu prüfen, könnte man per
Code: Alles auswählen
$fileType = $_FILES['attachment']['type'];
Code: Alles auswählen
$upload_granted="false";
if(in_array($filetype,$array_allowed_filetypes)) {
$upload_granted="true";
}
Das Ganze ist jetzt aber auch nicht wirklich zuverlässig. Ich kann eine php-Datei mit dem Inhalt
Code: Alles auswählen
<?php echo 'Murks!'; ?>
3) exif-imagetype
Alternativ käme bei Bilddateien das hier in Frage:
Die als "test.jpg" getarnte php-Datei fliegt auf, da $exif_imagetype leer ist.$upload_granted="false";
$exif_imagetype=exif_imagetype($tempFile);
if($exif_imagetype)
{
$imginfo_array = getimagesize($tempFile); // returns a false if not a valid image file
if ($imginfo_array !== false) $upload_granted="true";
}
2) und 3) in Kombination
Ich kann natürlich auch eine jpg-Datei als php-Datei tarnen. Ein Bild würde also von "schnappschuss.jpg" zu "schnappschuss.php" und würde - beim Direktaufruf per Browser - vom Webserver versucht auszuführen und das Leck ist da. - Korrigiert mich, wenn ich falsch liege - habe das probiert und im FF wird Zeichensalat ausgeworfen statt das Bild anzuzeigen. Was mit der Datei passieren soll, wird also an der Dateiendung/ dem Mime-Type festgemacht. Im IE dagegen wird das Bild angezeigt.
Die erste Prüfung dieser "schnappschuss.php" nach dem Mime-Type gibt als falschen Typ "application/octet-stream" aus. Der exif-imagetype wird mit "2" dagegen richtig erkannt. Der Dateianhang/Upload wäre - wenn nur nach dem exif-imagetype geschaut würde - völlig okay und die Datei würde gemailt und/oder auf dem Webserver gespeichert. Aber da hier ein ".php" als Dateityp vermerkt ist, stellt sich die Frage: wie verfährt der Webserver damit bei einem direkten Aufruf?
Hier müsste man dann also die beiden Prüfergebnisse gegeneinander laufen lassen und da "application/octet-stream" keine Bilddatei ist: Finito, kein Versand, kein Upload.
Man könnte aber auch die Dateiendung korrigieren. Wenn also der exif-imagetype eine "2" auswirft, bekommt die Datei im Mailanhang bzw. für den Upload auf dem Webserver ein ".jpg" verpasst - egal wie die ursprüngliche Endung lautete - was auch bei ".jpeg" usw. passieren würde.
4) Berechtigungen und Dateiname
Was noch zur Sicherheit beitragen dürfte, ist das Verhindern ausführbaren Codes im für die Ablage der Datei bestimmten Verzeichnis auf dem Webserver. Also Verzeichnis- und Dateiberechtigungen sowie Servereinstellungen entsprechend einrichten. Zusätzlich würde ich entweder den Originaldateinamen komplett ersetzen oder durch eine zufällige Zeichenfolge erweitern, was den Direktaufruf von außen erheblich erschweren würde. An den Pfad kommt man ja - zum Beispiel bei Profilbildern in Foren usw. - recht einfach. Und wenn der Dateiname nach dem Upload gleich bliebe, ließe sich die Datei auch aufrufen. Gut, wenn die vermaledeite Bilddatei als Profilbild angezeigt wird, dann lässt sich auch der Dateiname ermitteln und die Datei aufrufen. Meine Hoffnung ist jetzt, dass hier die Art der Ausführung durch die Korrektur von ".php" auf ".jpg" Schlimmeres verhindert. Was aber natürlich nicht für die eingangs erwähnten evil-jpegs mit Code in den exif-Daten usw. gilt. Hier würden dann aber die Berechtigungen das Ausführen von Code verhindern.
Das scheint mir - zumindest was Bilddateien betrifft - schon ganz okay zu sein. Oder reicht es die Berechtigungen zum Ausführen von Code zu beschränken? Zumindest was den Dateiupload betrifft. Eine per Mail weitergeleitete und als ".jpg" getarnte ".exe" müsste durch die Methoden 2 und 3 abgewiesen werden.
Wo ich aber gerade gar nicht weiter komme, ist die Frage: Was ist, wenn pdfs, docxs, pptxs usw. ebenfalls erlaubt sein sollen? Hier wird die Prüfung - für mich - schon sehr viel verworrener.
EDIT: Okay, habe hier dann doch endlich was vielversprechendes gefunden und lese mich mal ein: http://wiki.selfhtml.org/wiki/PHP/Anwen ... ile_Upload
Ich sag trotzdem schon mal Danke für eure Ideen!

Markus