Mailinglisten-Archive |
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