Securisation d'un script de listage de fichiers [resolu]

Securisation d'un script de listage de fichiers [resolu] - PHP - Programmation

Marsh Posté le 24-05-2006 à 11:48:12    

Salut
 
Je suis sur un script permettant de lister les fichiers contenus dans un repertoire.
 
Le fichier, nommé index.php, est situé dans le repertoire a lister et doit egalement permettre de parcourir les sous-repertoires.
 
j'utilise donc une fonction opendir / readdir.
Si le fichier lu est un repertoire, alors l'afficher avec un lien index.php?directory=repertoire
 
l'inconvenient est que si l'utilisateur rentre ?directory=../..  , c'est noel, il parcours mon disque.
 
je voudrais donc securiser ca en verifiant que le path demandé est bien un sous repertoire du script courant.
 
Quelques tests avec $_SERVER["PHP_SELF"] ou realdir n'ont rien donne de concluant...
Je suppose que le probleme est courant, ce genre de script étant répandu.
 
Un peu d'aide svp


Message édité par davius le 24-05-2006 à 12:33:46
Reply

Marsh Posté le 24-05-2006 à 11:48:12   

Reply

Marsh Posté le 24-05-2006 à 11:55:29    

avant de faire ton opendir vérifie que le répertoire en question est "lisible" [:spamafote]

Reply

Marsh Posté le 24-05-2006 à 12:00:45    

anapajari a écrit :

avant de faire ton opendir vérifie que le répertoire en question est "lisible" [:spamafote]


 
Oui mais un repertoire parent ( ../.. par exemple) sera lisible, par de probleme, mais je ne veux pas qu'il soit lu
 
Exemple
 
www
 + passwords
 + img
 + script
    + dir1
    + dir2
    - index.php
    - fichier1.txt
    - fichier2.txt
    - fichier3.txt
 
mon fichier index.php prend un parametre ?directory pour pouvoir lister un sous repertoire de script (index.php?directory=dir2 par exemple)
or si on utilise ce parametre avec .. alors on peut lister d'autres repertoires (index.php?directory=../passwords)
et je voudrais eviter ca en verifiant que le repertoire passe en parametre ?directory est bien dans le repertoire du script. (je ne sais pas trop si c'est clair, pour info, le script explorer Xp de psychokouak avait connu la meme faille a ses debuts)

Reply

Marsh Posté le 24-05-2006 à 12:04:42    

je fais quelques tests avec :
 
realpath($_GET['directory']);       --> c:\docs\wwwroot\script\dir1
$_SERVER["PHP_SELF"];             --> /script
 
d'ou probleme...

Reply

Marsh Posté le 24-05-2006 à 12:06:55    

et si tu testais simplement que ton paramètre ne contient pas '..' ???

Reply

Marsh Posté le 24-05-2006 à 12:07:59    

J'y ai pense, mais cela ne marcherai plus si je fait
index.php?directory=/passwords

Reply

Marsh Posté le 24-05-2006 à 12:13:00    

Bon alors clairement ton script est mal pensé :o
 
Il ne devrait pas prendre des chemins "relatifs" mais toujours pseudo-absolus.
Je m'explique:

  • si tu n'as pas de paramètres, il affiche par défaut ton répertoire www
  • si tu en as un(valeur='tonparamètre') il affiche www/tonparamètre/
  • et si tu souhaites un sous-répértoire, le paramètre doit alors être 'lerepertoire/lesousrepertoire/

Reply

Marsh Posté le 24-05-2006 à 12:20:08    

Justement, d'ou ma question de base, comment verifier que le parametre est bien un sous repertoire du repertoire dans lequel est contenu le script?
 
Si j'enleve .. ou / de mon parametre c'est boiteux comme solution...
 
donc je voudrais simplement obtenir le chemin (local, pas web) du script actuel

Reply

Marsh Posté le 24-05-2006 à 12:33:06    

Ca y est, enfin, je le tient :
 
$askedpath = realpath($_GET['d']);
$selfpath = dirname(realpath($_SERVER["DOCUMENT_ROOT"].$_SERVER["PHP_SELF"]));
if (strstr($askedpath, $selfpath))
{
      (afficher)
}

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed