Je réup un peu ce topic parce que ça me semble quand même important et c'est un bug qui mérite correction :p
Pour résumer.
Quand tu lances WebServer dans un certain dossier, c'est pour laisser les autres accéder à ce qu'il y a dedans, mais uniquement ce qu'il y a dedans.
Admettons que le serveur web soit lancé dans le dossier C:\MonSite
Si je demande le fichier Blabla.txt, j'imagine que le programme va rechercher C:\MonSite\Blabla.txt et le renvoyer si il le trouve.
Le problème c'est que le dossier ".." permet de remonter au niveau inférieur (dans l'arboresence)
Donc, si je demande la page ../autoexec.bat par exemple, le programme va aller chercher :
C:\MonSite\..\autoexec.bat
.. est le dossier parent, donc le fichier renvoyé sera simplement C:\autoexec.bat
Pour réparer le problème ya pas 36 solutions ^^
On filtre les ../ et les ..\
Attention il y a un piège !
Le fait de supprimer les ..\ et les ../ ne suffit pas à régler le problème.
En effet, si je tape
....//, seule la partie rouge va virer.
Et, la question à 1 million d'euros : que vas-t-il rester ?
../ (c'était prévisible hein ^^)
La solution serait donc quelque chose comme une boucle while du style (PHP) :
Code : Tout sélectionner
while (strpos($str, '../') !== false) // On efface les ../ jusqu'a ce qu'il n'y en ai plus
$str = str_replace('../', '', $str);
Autre truc a filter si le programme ne rajoute pas le chemin complet avant le fichier. (C:\MonSite\), il faut aussi filtrer les chemins abolus (C:\..., D:\..., ...)
C:\MonSite\C:\Autoexec.bat -> invalide
C:\Autoexec.bat -> valide
