PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem beim Auflisten von Dateien



Steiger_mp
17.05.2009, 09:36
Ich möchte alle Dateien in einem Verzeichnis auflisten.Dieses Verzcihnis enthält nur php Dateien.


if($dir=opendir($path))
{
while($file=readdir($dir))
{
if (!is_dir($file) && $file != "." && $file != "..")
{
printf('<a href="index.php?p=showc&id=%s">%s</a>', $file, $file);

echo "<br />";

}
}
closedir($dir);
}
Die Dateien werden als links ausgegeben wobei der dateiname als Parameter dient.
Um jedoch RFI Lücken zu vermeiden, möchte ich nicht,dass die ausgegebenen links eine Extension (in diesem Verzeichnis kommen nur .php Files vor)haben.Wie kann ich das nun bewerkstelligen?

Ich google seit ner Stunde und finde nichts.
Danke shconmal im voraus.

VeN0m
17.05.2009, 12:46
Also wenn Du machst



&id=%s.php


Könnte man es ja durch den Nullbyte (%00) ausgrenzen und per ../ das Verzeichnis wechseln. Ich empfehle Regex oder eine strpos()-Lösung. Was ich nun nicht verstehe ist, warum Du mit !is_dir arbeitest statt mit is_file. Ich optimiere einfach mal drauflos.
Erstmal per Regex:




if($dir = opendir($path)) {

$res = "";

while($file = readdir($dir)) {

if(is_file($file)) {

if(!preg_match("/php/",$file)) {

die("Access Denied!");

} else {

$res .= "<a href=\"index.php?p=showc&id=".$file."\">".$file."</a><br />";

}

}

}

print $res;
closedir($dir);

} else {

print "Can not open Dir";

}



Wie man sieht prüfe ich per preg_match() und /php/, ob PHP im String vorkommt. Wenn nicht wird das gesamte Script per die() beendet und "Access Denied!" ausgegeben. Sofern jemand also versucht etwas anderes, als "php" zu übergeben oder dieses per Nullbyte auszugrenzen wird das Script beendet. Anders ginge es auch mit strpos, was ich jedoch nicht so elegant fände. Hierbei sähe es so aus:




if($dir = opendir($path)) {

$res = "";

while($file = readdir($dir)) {

if(is_file($file)) {

if(strpos($file,"php") === false) {

die("Access Denied!");

} else {

$res .= "<a href=\"index.php?p=showc&id=".$file."\">".$file."</a><br />";

}

}

}

print $res;
closedir($dir);

} else {

print "Can not open Dir";

}



Strpos sucht nach dem ersten Vorkommen von "Suchmich" (Parameter zwei) in "Meinstring" (Parameter eins). Da hier sowohl "1" und "0" als auch "true" und "false" vorkommen können prüfen wir mit "===" (ganz genau typ- und wertgleich), ob "php" vorkommt. Wenn halt nicht wird wieder "access denied" per die() ausgegeben und das Script beendet.
Ich habe jetzt mit is_file() gearbeitet, weil ich das etwas eleganter finde. Zudem habe ich Dein printf durch ein $res .= ersetzt, was die Variable $res dann immer wieder erweitert. Das heißt, dass erst wenn die Schleife zuende ist eine Ausgabe stattfindet und nicht schon vorher, was nochmal die Sicherheit verstärkt. Denn wenn die() aufgerufen wird kommt die Schleife niemals zu einem Ende, weil sie an dieser Stelle beendet wird (mit dem Script gleich mit). Kann der Ordner nicht geöffnet werden wird ein Fehler ausgegeben.

Zum lesen: PHP-Manual: Strpos (http://de.php.net/manual/de/function.strpos.php) sowie PHP-Manual: Preg_Match (http://de.php.net/manual/de/function.preg-match.php), PHP-Manual: is_file (http://de.php.net/manual/de/function.is-file.php) und Wikipedia: Regulärer Ausdruck (Regex) (http://de.wikipedia.org/wiki/Regex)

Viel Spaß :)