3

PHP: Probleme mit Datei Upload unter Windows

php-big

Nachdem ich vor ein paar Tagen, im Rahmen des „Developers Shame Day“, in meiner Giftgrube gewühlt  und ein Code Schnipsel aus vergangenen Tagen veröffentlicht habe, kommt der heutige Beitrag wieder aus der Richtung „Was mache ich, wenn … ?“.

Während den Arbeiten an einem Projekt, testen wir die Seiten nicht nur mit verschiedenen Browsern, sondern auch mit verschiedenen Server Betriebssystemen. Wir wollen so gewährleisten, dass der Kunde einen Server seiner Wahl nutzen kann, ohne auf ein Feature verzichten zu müssen.

Ein Kollege sprach mich, nach solch einem Testlauf, darauf an, dass er Probleme mit Dateien hat, die er mittels Datei Upload in sein Windows Testsystem lädt. Beim Zugriff auf diese Dateien, wird er von Windows darauf aufmerksam gemacht, das er nicht die benötigten Rechte dazu besitzt.

Was ist passiert?

PHP speichert jede hochgeladene Datei in einem temporären Verzeichnis zwischen und gibt diese Information an das eigentliche PHP Skript weiter. Durch die Ablage im temporären Verzeichnis, gehen die Zugriffsrechte des Verzeichnisses auf die Datei über und bleiben auch nach evtl. Kopiervorgängen erhalten.

Sofern ihr den Pfad zum upload_tmp_dir nicht angepasst habt, wird das temporäre Verzeichnis eurer Windows Installation (C:\Windows\Temp) genutzt und für das habt ihr normalerweise keine Rechte.

Was kann man machen?

Um das Problem dauerhaft, und ohne Anpassung irgendwelcher Skripte zu beheben, stehen euch die folgenden drei Möglichkeiten zur Verfügung.

Möglichkeit 1:

Gebt dem Benutzer, der die Dateien weiterverarbeiten soll, die entsprechenden Rechte für das temporäre Verzeichnis. Zukünftige Dateien erben diese dann ebenfalls.

Möglichkeit 2:

Ändert in eurer php.ini den Wert von upload_tmp_dir und tragt ein Verzeichnis ein, für das ihr Zugriffsrechte habt.

Möglichkeit 3:

Legt euer Web Root und das temporäre Verzeichnis auf verschiedene Partitionen/Laufwerke. Durch das Kopieren auf eine andere Partition werden die Zugriffsrechte für die Datei automatisch erweitert.

Comments 3

  1. Das Problem, dass man im temp keine Rechte hat und sich diese Rechte weitervererben ist nicht ganz zu ende geschrieben: Greift man nun direkt auf diese Dateien zu (via Explorer), dann hat man keine Rechte und der Zugriff schlägt fehl … ABER:
    1. Die Dateirechte sind natürlich so, dass PHP problemlos zugreifen kann, denn PHP hat die Datei ja auch „erschaffen“ und ist somit der owner der Datei.
    2. Natürlich sollte man nicht direkt auf die Dateien zugreifen, sondern diese vielmehr auch zum Download über ein entsprechend dynamisches Script anbieten (download.php?docID=12 oder so). Dieses lädt dann – als Owner – die Datei und überträgt diese zum Nutzer … wo dann die Datei mit dessen Nutzerrechten gespeichert wird. Damit ist die Datei wieder aufrufbar.

    Im Prinzip bietet dieses Verhalten etwas(!) mehr Sicherheit, da nicht jeder unter Windows die Datei auch „einfach so“ lesen oder löschen kann.

    1. Post
      Author

      zu 1.
      Das ist natürlich richtig. PHP selbst hat die Rechte mit der Datei zu arbeiten.

      Das sie aber nur PHP hat, sehe ich persönlich als Problem. Denn sogar dem Administrator des Systems fehlen die Rechte irgendwas mit der Datei zu machen.

      Und das macht regelmäßig Probleme, wenn wir neuen Content eingepflegt haben, und diesen sichern wollen, oder bei einem der Testsysteme eine Reinigung ansteht. Da heißt es dann, jede Datei prüfen und ggf. Rechte gewähren.

      Ich halte es allerdings auch nicht für Absicht, denn allein schon dadurch, das die Datei auf eine andere Partition kopiert wird, habe ich alle Rechte die ich brauche.

      zu 2.
      Ist das wirklich so natürlich? Ich persönlich bevorzuge es, wenn der Server die Dateien ausliefert, ohne das mein PHP Script Byte für Byte an den Client senden muss. Er kann das weit performanter als jedes PHP Script, denn es ist das, wozu er geschrieben wurde.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.