Hello Christian, Hello Sven,
Je länger wir drüber diskutieren, desto mehr komme ich aber zur Ansicht, dass die Funktion move_uploaded_file() eigentlich vielmehr einen dritten, optionalen Parameter BOOLEAN $overwrite bekommen sollte, mit dem man (default true) das Überschreiben der vorhandenen Datei aktiviert oder (false) einen Error erhält, wenn die Zieldatei schon vorhanden ist.
ACK. Ich habe das mal als Patch eingereicht:
erstmal vielen Dank für den Einsatz. Das ist wohl ein praktikabler Weg, das eine der zwei Probleme aus dem Weg zu räumen :-)
allerdings steckt das eingentliche SICHERHEITS-Kernproblem mMn immer noch drin in der Funktion. Wenn ein shared TMP-Verzeichnis benutzt wird, ist immer noch keine Sicherheit vorhanden.
Der Patch con Christian würde nur das UNGESCHICKLICHKEITS-Problem der Funktion beseitigen.
Wenn ich die Zeilen
5759 if (!zend_hash_exists(SG(rfc1867_uploaded_files), path, path_len + 1)) {
5760 RETURN_FALSE;
5761 }
betrachte, dann nehme ich hier an. dass nur der Hash über den Namen der Datei gebildet wird, nicht jedoch über deren Inhalt. Aber genau dies müsste geschehen. Das war auch schon in dem alten Thread mein Anliegen.
http://forum.de.selfhtml.org/archiv/2011/4/t204544/#m1385518
Es müssten also an zwei Stellen Änderungen vorgenommen werden:
1. Beim Upload, bevor überhaupt das Script Kontrolle erlangt:
Dort müsste kein Hash über den Namen, sondern über den Inhalt
der Datei in den Speicherbereich des Scriptes geschrieben werden.
2. in den o.g. Zeilen: hier müsste nicht der Hash über den Namen, sondern über den Inhalt
der Datei geprüft werden.
Die Datei müsste für den "Hash abfragen, rename()-durchführen-Prozess" gesperrt werden
gegen jede Änderung. Das lässt ein "rename()" aber nicht zu, weil es kein Handle, sondern
nur einen Namen akzeptiert.
3. Wir müssen also zu Handle-basierten Funktionen auch in der Code-Schicht von PHP kommen.
Anders sehe ich nicht, wie man _ohne_ eigenes upload_tmp_dir für Sicherheit sorgen könnte.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg