misterunknown: Filemanager-Skript

Beitrag lesen

Moin,

ich hab vor einiger Zeit angefangen ein Upload-Skript in PHP zu schreiben, was sich dann mehr und mehr zu einem Dateiverwaltungstool entwickelt hat. Sehr einfach gehalten aber doch effizient.
Da es eine simple one-file-Lösung ist und bleiben soll, hatte ich bisher noch keine Funktion zum Navigieren durch Verzeichnisse implementiert. Das heißt also, das Skript hat nur im eigenen Verzeichnis operiert.

Nun habe ich aber eine eben solche Funktion geschrieben. Es funktioniert auch alles soweit, allerdings möchte ich sicherstellen, dass man nicht durch irgendeinen Hack eine Ebene höher kommt, als das Skript liegt. Liegt das Skript also beispielsweise "/var/www/html/upload", soll man nicht "/var/www/html" anzeigen lassen können, aber auch nicht "/var/html/Foo/Bar".

Zur Sicherstellung habe ich also eine Funktion geschrieben, die den Weg "abgeht" bis zum Zielordner und, sollte man eine Ebene höher als gewollt kommen, den Vorgang abbricht:

  
// $_SESSION["dir"] setzt sich aus dem aktuellen Verzeichnis (absoluter Pfad)  
//und dem per $_GET-übergebenen relativen Pfad zusammen  
// Beispiel: /var/www/html/upload/test   +   ../../  
//                  ^ akt. Verz.               ^ per GET übergebener Pfad  
// $_SERVER["DOCUMENT_ROOT"] wäre in diesem Fall /var/www/html/upload  
$levelTeststr = substr($_SESSION["dir"],strlen($_SERVER["DOCUMENT_ROOT"]));  
$levelTest = explode('/',$levelTeststr);  
unset($levelWasNeg);$curlevel=0;  
foreach($levelTest as $via) {  
	if($via=="."||$via=="") $curlevel=$curlevel;  
	elseif($via=="..") $curlevel--;  
	else $curlevel++;  
	if($curlevel<0)$levelWasNeg=1;  
}  
if(isset($levelWasNeg)&&$levelWasNeg<>0)$_SESSION["dir"]=$_SERVER["DOCUMENT_ROOT"];  
if(is_dir($_SESSION["dir"]))chdir($_SESSION["dir"]);  

Ich wollte jetzt von euch wissen, wie SICHER ist diese Methode der Überprüfung? Sieht jemand schon auf den ersten Blick einen Hack oder eine Injection?

Grüße Marco