donc j'ai de bonnes et de mauvaises nouvelles.
la bonne : j'ai repéré le bug
la mauvaise : il y a clairement un manque de fonctionnalité, voir un bug.
Explication :
Il existe dans la class /lib/ImageManager/Classes/ImageManager.php une fonction getDirs() qui , en substance, donne la liste des répertoires et sous répertoires existant à partir d'un path donné à la classe que nous appellerons ici $PATH
Dans notre cas (4 ou 5 niveau de profondeur, des milliers de fichiers) ça prend du temps de tout explorer. C'est normal dans l'absolu ...
Seulement, il y a une autre fonction dans cette classe : validRelativePath(), une fonction qui a pour rôle de déterminer si un path relatif passé en paramètre est correct par rapport au $PATH de la classe. Je me serais attendu à un code de ce type :
* contrôle d’existence de répertoire
* doublé par un contrôle regex sur l'absence de chemin foireux (../../../../config.php) ,
* triplé par un contrôle pour s'assurer que le path relatif démarre bien de $PATH.
Rien de complexe à priori ... sauf que le code de validRelativePath() fait appel à getDirs() qui réalise du coup un listing TOTAL des répertoires existants pour voir si il existe bien dans la liste ... Encore mieux : il réalise ce scan pénible et retourne true si le paramètre est égal à '/' ... autant dire que le scan est fait inutilement dès lors que vous êtes à la racine ^^
J'ai loupé un wagon là ....
Citation :/**
* Check if the given path is part of the subdirectories
* under the base_dir.
* @param string $path the relative path to be checked
* @return boolean true if the path exists, false otherwise
*/
function validRelativePath($path)
{
$dirs = $this->getDirs();
if($path == '/' || $path == '\/') return true; // stupid windoze.
//check the path given in the url against the
//list of paths in the system.
for($i = 0; $i < count($dirs); $i++)
{
$key = key($dirs);
//we found the path
if($key == $path) {
return true;
}
next($dirs);
}
return false;
}
Et manque de bol .... la fonction validRelativePath() est utilisée un peu partout ...
La boucle est bouclée : tu te tapes des timeout en ligne dès que ton hébergement n'est pas capable de scanner tes répertoires en moins de 30s ... Comportement différent de la 1.9.4.3 ou nous n'avions pas de lenteur
Voilà, je laisse les autres commenter mon analyse, néanmoins je vais devoir sans aucun doute pondre un nouveau code pour assurer le site de vivre sans pour autant mettre sa sécurité en jeu ^^'