sigger: Sicherheit von Dateiuploads

Beitrag lesen

Hallo Leser und Schreiber,

fast jeder Entwickler wird im Laufe seiner Web-Karriere zumindest einmal mit dem Thema Datei-Upload in Berührung gekommen sein. Dank recht unkomplizierter Handhabe der benötigten Technologien ist die bloße Implementierung schnell durchgeführt und das Ziel, das Hochladen von Dateien, ist erreicht. Schön- oder?

Wie immer beim Übertragen oder Speichern von Daten von einem Benutzer ist natürlich größte Vorsicht geboten. Für Entwickler die schon alleine bei Textfeldeingaben aufgrund möglicher  SQL-Injections Angstschweiß auf der Stirn bekommen, ist ein Dateiupload sicher ein Grund in suizidalen Gedanken zu versinken.

Der Inhalt einer Datei lässt sich in der Regel weniger einfach durchsuchen als ein kleiner String. Ein "Escapen" von Dateiinhalten ist im Bezug der "Kosten / Nutzen" Rechnung ebenso fragwürdig.

Dennoch haben sich ein paar bekannte Möglichkeiten etabliert dennoch ein Mindestmaß an Sicherheit gewährleisten zu können.

1. Prüfen der Dateiendung der hochgelandenen Datei.
2. Prüfen des Mime-Types
3. Prüfen der Dateigröße und Einschränkung der Maximalgröße

Was aber eigentlich viel Interessanter ist, ist die Frage, was eigentlich mit der Datei die vom Webclient gesendet wird auf dem Server passiert.

Laut der PHP-Doku wird die Datei in dem Standard TMP Ordner des Servers hinterlegt, dass in der Regel nicht durch das Web erreichbar ist. Diese Grundidee ist einerseits beruhigend, da so die Benutzerdatei nicht durch einen Aufruf aus dem www. Ausgeführt werden kann, andererseits befindet sich nun ein Fremdkörper im regulären Dateisystem des Servers, wenn auch nur für die Dauer des Requests.

"Wurde die Datei in dem temporären Verzeichnis nicht verschoben oder umbenannt, wird sie am Ende des Requests gelöscht." Zitat: http://de2.php.net/manual/de/features.file-upload.php.

Ein weiterer, grundlegender Aspekt der Sicherheit eines Uploaders, ist das Fortfahren der Arbeit mit der Datei. Entweder sie wird an ihren eigentlichen Einsatzort kopiert, etwa für eine Art Web-FTP oder sie wird sonst wie weiter modifiziert.
Diese Art des Datenhandlings ist meiner Ansicht nach das gefährlichste, da eine Datei mit beliebigen Inhalten von einem Anwender ausgeführt werden könnte. Hier hilft dann besten Falls der save_mode.

Weitergehend interessant ist der Bezug von einem Datei-Upload zu Datenbank-Blobs.
Hier drängt sich wieder die Frage der Gefahr durch Injections auf, wenn man den "Stream" einer Datei in der Datenbank speichert.

Bereits getestet habe ich das Hochladen von XML-Dateien. Eine XML-Datei mit folgendem Inhalt:

<?xml version="1.0"?>
<foo>
<image> ' SELECT * FROM somewhere-- </image>
</foo>

Passiert Problemlos sogar einen Test mit Dom::loadXML, da es ja valide ist.

Da man klassischer Weise in einer XML-Datei nicht alle Anführungszeichen escapen sollte, steht man hier vor einem Problem, da das oben stehende SQL-Statement in einerm INSERT ausgeführt werden würde(!).

Die einzige Lösung die bisher bekannt ist, ist das speichern solcher Datensätze, die vorher Base64 kodiert werden.

Mir wäre es sehr lieb, wenn Ihr Eure Erfahrungen in Bezug auf Dateiuploads hier schildern würdet. Besonderes Interesse besteht natürlich an Negativerfahrungen, auch wenn diese keinem Gewünscht werden.

Wie handelt Ihr Datenstreams die als Blob gespeichert werden sollen?

Bin für jede Diskussion, Meinung und Erfahrung dankbar.

Danke fürs Lesen.

Mit freundlichen Grüßen