2009-08-26 9 views
0

Je travaille sur un script pour permettre aux utilisateurs de naviguer dans un répertoire donné, qui n'est pas le répertoire dans lequel ce fichier est installé, mais dans une variable.répertoriant un contenu de dossier: comment empêcher l'utilisateur d'aller au-dessus du répertoire autorisé?

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

Maintenant, le html rendu permet de naviguer dans les sous-dossiers à l'intérieur de ce dossier. J'utilise une variable GET "dir" pour dire à mon script quel contenu du sous-dossier afficher et un lien ".." permettant d'aller vers le haut, en utilisant la même variable dir.

J'ai mis une vérification que si $ _GET ['dir'] est égal à FOLDER, il ne devrait pas afficher ce lien "..". Mais il est assez facile de jouer avec cette variable dans l'url et où que je fasse, mon script permet de naviguer au-dessus du dossier autorisé. Donc, je pense que je devrais vérifier le chemin local complet du répertoire autorisé par rapport au répertoire demandé et si ce dernier n'est pas dans le répertoire autorisé, ne pas afficher le ".." .

Mais je ne sais pas comment faire ça. Tous les conseils ou pointeur seraient appréciés. Merci

+0

Même si le titre ne donne pas loin, cela est essentiellement la même question que http://stackoverflow.com/questions/1066930/sending-variables- for-php-filesystem-functions-with-form-submission/ – deceze

+0

Oui, problème/solution similaire. –

Répondre

1

Vous voudrez peut-être regarder realpath().

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

... ou quelque chose comme ça.

Copié de this answer, puisque je pense que cette question est meilleure.

+0

vous remercie. $ foo est le répertoire demandé, et/mon/chemin/le autorisé, non? – pixeline

+0

C'est vrai. :) – deceze

0

ou vous pouvez utiliser regex

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

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

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

Vous devez utiliser preg_quote() au lieu de addslashes(). –

+0

preg_quote() ne remplacera pas mes barres obliques car les caractères de début et de fin de regex pourraient être presque tout, mais vous pouvez l'ajouter en plus à addslashes() – stefita

Questions connexes