Hallo Gemeinde,
beim Anbieten von Downloads per readfile() (wie im Kochbuch unter
http://selfphp.de/kochbuch/kochbuch.php?code=37 bei SelfPHP beschrieben) stellt sich ja die Frage, wie man verhindert, dass die verlangte Datei völlig frei wählbar ist ("Ausbruchsicherung" gegen Dateinamen wie ../../geheim.txt). Sonst stünde ja der ganze Rechner offen.
Im Kochbuch hat man das gelöst, indem man die herutnerladbaren Dateien in einem Array aufzählt. Mir schwebt ein anderer Ansatz vor. Denke ich bei folgendem Ansatz richtig, wenn ich für meinen Fall nur Downloads von Dateien innerhalb des DocRoot und seinen Subordnern anbieten will?
* Ermittle den dirname der angeforderten Datei (Ergebnis in $dateipfad ablegen)
* Wandle $dateipfad per realname() in einen "laufwerkshaltigen" Pfad um
* Ermittle das DocumentRoot mit $DOCUMENT_ROOT (Ergebnis in $docrootpfad ablegen)
* Wandle $docrootpfad mit realname() in einen "laufwerkshaltigen" Pfad um
* Vergleiche $dateipfad mit $docrootPfad per eregi($docrootPfad,$dateipfad)
Wenn der Vergleich true ergibt, ist die angeforderte Datei im oder unterhalb des DocRoots. Ansonsten wurde versucht, eine Datei sonstwo auf dem Webserver abzugreifen.
Wäre dieser Weg halbwegs gangbar, oder hab ich noch ein Scheunentor offen? Ich nutze XAMPP (Apache 2.0.52, PHP 5.3.1) auf einem Win-2k-Rechner.
Gruß