move_uploaded_file()
gehört mMn schon lange auf die depricated-Liste. Es ist noch entstanden zur Zeit der unsicheren globalen Arrays. Mit der Einführung von$_FILES
wurde aber der temporäre Name des hochgeladenen Files abgesichert. Damit wurde die Sicherheitslücke, diemove_uploaded_file()
vorher schließen sollte, beseitigt.
Von welcher Sicherheitslücke sprichst du? Das Upload-Verzeichnis dient gewissermaßen als Sandbox: die Datei wird erstmal an eine Stelle geschoben, an der sie nicht viel Schaden anrichten kann. Es ist dann Aufgabe der Anwendung die Datei zu überprüfen (bspw. auf Mime-Type oder Viren) bevor sie aus der Sandbox an eine andere Stelle verschoben wird. Die normalen PHP Dateisystem-Funktionen haben ggf. keinen Zugriff auf das Upload-Verzeichnis, wenn es außerhalb des open_basedir
-Verzeichnisbaums liegt. Deshalb braucht man move_uploaded_file
als privilegierte Funktion.
Daher ist die von mir vorgestellte Funktion
save_uploaded_file()
auf jeden Fall zielführender. Sie ermöglicht das TOCTTOU-freie Speichern von Dateien mit Statusrückmeldung
Ich habe gerade im PHP Sourcecode nachgesehen, move_uploaded_file
benutzt unter der Haube auch den Filelock-Mechanismus. Man muss ein bisschen graben bis man auf diese beiden Zeilen stößt:
srcstream = php_stream_open_wrapper_ex(src, "rb", src_flg | REPORT_ERRORS, NULL, ctx)
deststream = php_stream_open_wrapper_ex(dest, "wb", REPORT_ERRORS, NULL, ctx);
Der zweite Parameter ist der File-Mode.
und insbesondere erspart sie beim Zusammenwirken mit Datenbanken an dieser Stelle wieder Overhead. •••
Wie das?