Moin!
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.
Sicherheit gegen was?
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.
Es wird kein Hash gebildet, weder über den Inhalt der Datei noch über den Namen.
zend_hash_exists() ist eine Funktion oder ein Makro, welches in einem Speicherbereich, der genau wie PHP-Arrays hashbasiert indexiert ist, nachsieht, ob dort ein Eintrag für die fragliche Datei existiert - denn nur dann wurde sie in diesem Skript hochgeladen.
Es müssten also an zwei Stellen Änderungen vorgenommen werden:
- 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.
Warum?
- 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.
Warum?
- Wir müssen also zu Handle-basierten Funktionen auch in der Code-Schicht von PHP kommen.
Warum?
Anders sehe ich nicht, wie man _ohne_ eigenes upload_tmp_dir für Sicherheit sorgen könnte.
Warum?
- Sven Rautenberg