2009-08-26 3 views
0

Ich arbeite an einem Skript, um Benutzern zu ermöglichen, ein bestimmtes Verzeichnis zu durchsuchen, das nicht das Verzeichnis ist, in dem sich diese Datei befindet, sondern in einer Variablen festgelegt ist.Auflistung eines Ordners Inhalt: Wie verhindert man, dass Benutzer über das autorisierte Verzeichnis gehen?

define('FOLDER', '../_files/'); 

Jetzt ermöglicht das Rendred HTML, Unterordner in diesem Ordner zu navigieren. Ich benutze eine "dir" -GET-Variable, um meinem Skript mitzuteilen, welcher Inhalt des Unterordners angezeigt werden soll und einen Link "..", der es erlaubt, nach oben zu gehen, wobei dieselbe dir-Variable verwendet wird.

Ich habe eine Überprüfung, dass, wenn $ _GET ['dir'] ist gleich FOLDER, sollte es nicht angezeigt, dass ".." Link. Aber es ist einfach genug, sich mit der Variablen zu beschäftigen, die sich in der URL befindet, und wo immer ich das tue, erlaubt mein Skript, über dem autorisierten Ordner zu blättern. Nicht gerade eine sichere Situation ...

Also ich denke, ich sollte den vollständigen lokalen Pfad des autorisierten Verzeichnisses gegen das angeforderte Verzeichnis überprüfen und wenn letzteres nicht innerhalb der autorisierten ist, nicht die ".." .

Aber ich weiß nicht, wie das geht. Irgendwelche Hinweise oder Zeiger würden geschätzt werden. Danke

+0

Auch wenn der Titel es nicht weggeben, das ist im Grunde die gleiche Frage wie http://stackoverflow.com/questions/1066930/sending-variables- for-php-Dateisystem-Funktionen-mit-Formular-Vorlage/ – deceze

+0

Ja, ähnliches Problem/Lösung. –

Antwort

1

Sie möchten vielleicht realpath() betrachten.

$foo = realpath($foo); 
if (substr($foo, 0, 8) != '/my/path') { 
    return false; 
} 

... oder so ähnlich.

Kopiert von this answer, da ich denke, diese Frage ist besser.

+0

danke dir. $ foo ist das angeforderte Verzeichnis und/my/path/der autorisierte, oder? – pixeline

+0

Das stimmt. :) – deceze

0

oder könnten Sie regex

$requested = realpath($foo); 
$allowedpath = '/path/to/allowed'; 

$regex = '/^'.addslashes($allowedpath).'\/?.*$/'; 

if (!preg_match($regex, $requested)) { 
    return false; 
} 
+0

Sie sollten preg_quote() anstelle von addslashes() verwenden. –

+0

preg_quote() wird meine Schrägstriche nicht ersetzen, da die Anfangs- und Endzeichen von regex fast alles sein können, aber Sie können es zusätzlich addslashes hinzufügen() – stefita

Verwandte Themen