phpbar.de logo

Mailinglisten-Archive

[php] Prüfung nach Dateiupload per Formular

[php] Prüfung nach Dateiupload per Formular

Yannik Hampe yannik at cipher-code.de
Son Nov 11 13:09:46 CET 2007



Armin Briatta wrote:
> Einen schönen Sonntag an alle,
> 
> Ich habe eine Frage zur Sicherheit:.
> 
> Bisher habe ich ein Formular zum Upload von Dateien gebaut. Aufgeladen 
> werden dürfen Bilddateien, pdf, Word-Dateien, Adobe Illustrator und 
> Adobe InDesign Dateien sowie zip-Dateien.
> 
> Das Formularfeld ist nur mit Benutzername und Passwort erreichbar.
> 
> Nach dem Upload prüfe ich jeweils anhand einer Whitelist den mime type.
> Zusätzlich prüfe ich, ob die Dateiendung zugelassen ist und natürlich, 
> ob schon eine Datei mit gleichem Namen vorhanden ist.
> 
> Erst dann werden die neu aufgeladenen Dateien endgültig gespeichert und 
> zusammen mit den schon früher aufgeladenen Dateien in einer Liste zum 
> Abrufen ausgegeben, ansonsten gibt es eine Fehlermeldung.
> 
> Den Dateinamen der neuen Datei übernehme ich vom Benutzer, nachdem ich 
> Leerzeichen entfernt und deutsche Umlaute durch ae, oe u.s.w. sowie das 
> ß durch ss ersetzt habe.
> 
> Nun die Frage:
> 
> Haltet Ihr diese Prüfungen für ausreichend oder habe ich wesentliche 
> Sicherheitsaspekte nicht beachtet?

Nein, denn:
Wenn der Dateiname vom Client ein null-Byte enthält (xyz.php%00.txt)
Dann wird dir php bestätigen, dass der Dateiname auf .txt endet. Beim 
verschieben der Datei geht alles ab dem nullbyte verloren.
Um das mal zu verdeutlichen:
----
%php -a
Interactive shell

php > echo bin2hex("a\0b");
610062
php > var_dump(file_exists("a"));
bool(false)
php > touch("a\0b");
php > var_dump(file_exists("a"));
bool(true)
----
Wenn du kannst solltest du die Dateien in einem Ordner speichern, der 
für den Webserver nicht zugänglich ist und die Datein umbenennen (zum 
Beispiel mit Hilfe einer id aus einer DB oder mit uniqid. Oder du 
wendest einmal rawurlencode() auf die Funktion an:
----
php > echo rawurlencode("a\0b");
a%00b
----

> Liebe Grüße
> Armin

Yannik

php::bar PHP Wiki   -   Listenarchive