Autor: Andreas Fiesser (fiesser_at_gmx.net)
Datum: 15. Aug 2002
Ich hab mir das nochmal genauer angeguckt.
Umask zieht scheinbar deshalb nicht, weil der Upload nicht innerhalb
des Skriptes passiert, sondern per HTML-Form. Apache erzeugt also
die Datei mit einem temporären Namen zB in /tmp.
Mit PHP wird die dann von dort an ihr eigentliches Ziel buxiert.
PHP hat da 2 Funktionen.
1) move_uploaded_file (src_1, trg)
2) copy (src_2, trg)
src_1 ist der Name des HTML-Form-Elementes vom Typ file
src_2 ist ein normaler Dateiname
1) ist offenbar genau zu dem Zweck gebaut, der hier vorliegt. Falls
der Funktionsaufruf klappt, hat die hochgeladene Datei die Rechte
0600.
Man kann auf diese Datei chmod anwenden, aber selbst wenn sie auf
read-only steht, überschreibt sie dieser move-Befehl, wenn der
Dateiname nochmal vorkommt.
2) versucht die Datei zu kopieren und beachtet dabei die
Zugriffsrechte einer evtl. bereits existierenden Datei.
Die temporäre Datei wurde mit den Standardrechten versehen. Man muß
sie also auch hier mit chmod bearbeiten.
Anschließend muß noch die temp. Datei gelöscht werden. Also braucht
man mindestens doppelt so viel Platz, als die Datei groß ist.
Sicherer ist 2) aber im Normalfall ist 1) vorzuziehen.
Man muß ohnehin die Existens der Zieldatei vor dem copy prüfen, wenn
man einen unschönen Warntext vermeiden will. Man kriegt den
Dateinamen erst nach dem Upload mit, man kann daher nicht vorher
warnen, dass eine Gleichnamige bereits da ist.
Jetzt kann man die Datei nur noch umbenennen oder verwerfen.
Gruß
andreas
Dieses Archiv wurde generiert von hypermail 2.1.4 : 15. Aug 2002 CEST