Moin!
Und ich habe es sehr wohl erklärt, wie Ersatz zu leisten ist.
Nicht mit Code. Mit Geschwafel und Gejammer.
Durch die Absicherung des Arrays $_FILES, das offiziell erst _nach_ den Funktionen *_uploaded_file() eingeführt worden ist, ist der Dateiname für hochgeladene Files im Element $_FILES[<name>]['tmp_name'] sicher. Er wird vom System vergeben und ist nicht mehr von Usereingaben manipulierbar. Das war mit den Scriptvariablen zum Upload nicht der Fall. Das Problem mit register_globals ist ja hinlänglich bekannt.
Du gehst davon aus, dass $_FILES read-only ist und durch eventuelle Lücken im Code nicht geändert werden kann. Dass diese Annahme falsch ist, hat dir ChrisB in seinem Plugin-Beispiel gezeigt.
Ein File, dass im Array $_FILES benannt wird, _muss_ also ein uploaded File sein.
Zum Skriptstart vermutlich ja - derzeit nicht bekannte Injection-Lücken mal ausgenommen. Zur weiteren Laufzeit des Skriptes aber nicht mehr.
Die übrigen von dir genannten "Sicherheiten" werden von den Filefunktionen
- fopen
- flock
- fread
- fwrite
ebenfalls (sinngemäß) erfüllt.
Ok, jetzt bitte mal konkret: Was heißt denn "sinngemäß" bei dir. So eine Einschränkung macht man doch nur, wenn man sich nicht sicher ist.
Und dann hätten ich auch gerne noch die Bewertung der Performance und des Speicherverbrauchs mit in die Diskussion gebracht.
Die einzige Abweichung ist, dass in der "Liste der hochgeladenen Files", die im $_FILES-Array geführt wird, das File nach dem Auslesen nicht gelöscht wird.
Nein. Die wichtigste Abweichung ist, dass du das File bei Benutzung von fopen etc. nicht BEWEGST, also billig nur den Dateipointer im Dateisystem an eine andere Stelle schreibst, sondern garantiert KOPIERST, also den gesamten Dateiinhalt (ggf. sukkzessive) in den Speicher liest und wieder wegschreibst.
Das mag für eine 10KB-Textdatei in Ordnung sein. Für ein 50MB-Videoupload ist es das mit Sicherheit nicht.
Welchen Sicherheitsaspekt das bringen sollte, dass man das Temp-File nur einmal kopieren darf, kann ich mir auch nicht vorstellen.
Du kannst deine einzelne hochgeladene Datei mit bösem Inhalt nicht mehrfach im Dateisystem verteilen, sondern nur an eine einzige Stelle bewegen.
Ich werde trotzdem versuchen, den zugehörigen Codeabschnitt zu $_FILES zu finden um zu schauen, was da noch unsicher sein kann.
Kann ja nicht so schwierig sein, ein GREP auf den Quelltext zu machen, um die relevanten Stellen zu finden. Den Code für move_uploaded_file() habe ich durch trial-and-error im SVN-Viewer aufgetrieben, weil ich den Source nicht komplett herunterladen wollte.
- Sven Rautenberg