Il est vraiment, vraiment dangereux de faire quelque chose comme: opendir($local_directory)
où $local_directory
est une valeur qui pourrait provenir de l'extérieur. Et si quelqu'un passe quelque chose comme ../../../../../../../../../etc
... ou quelque chose comme ça? Vous risquez de compromettre la sécurité de votre hôte.
Vous pouvez prendre un coup d'oeil ici, pour commencer: http://php.net/manual/en/book.filter.php
à mon humble avis, si vous ne créez rien à la volée, vous devriez avoir quelque chose comme:
$allowed_dirs = array('dir1','dir2', 'dir3');
if (!in_array($myvar, $allowed_dirs)) {
// throw an error and log what has happened
}
Vous pouvez le faire juste après avoir reçu votre contribution de "dehors". S'il vous est impossible de le faire car le nombre de répertoires d'images peut varier avec le temps et que vous avez peur de manquer la synchronisation avec votre base de code, vous pouvez également remplir le tableau de valeurs valides en scannant les sous-répertoires dossiers en premier.
Ainsi, à la fin, vous pourriez avoir quelque chose comme:
$allowed_dirs = array();
if ($handle = opendir(dirname(__FILE__) . '/images')) {
while (false !== ($entry = readdir($handle))) {
$allowed_dirs[] = $entry;
}
closedir($handle);
}
$myvar=$_GET['var'];
// you can deny access to dirs you want to protect like this
unset($allowed_dirs['private_stuff']);
// rest of code
$local_directory = dirname(__FILE__) . "/images/.$myvar";
if (in_array(".$myvar", $allowed_dirs) && $handle = opendir($local_directory)) {
$i=0;
while (false !== ($entry = readdir($handle))) {
if(strstr($entry, 'sample_'.$language.'-'.$type)) {
$result[$i]=$entry;
$i++;
}
}
closedir($handle);
} else {
echo 'error';
}
code est pas optimisé ci-dessus. Mais évitons dans ce cas une optimisation prématurée (en indiquant ceci pour éviter une autre "baisse"); L'extrait est juste pour vous donner l'idée d'autoriser explicitement les valeurs VS l'approche alternative de tout autoriser à moins de correspondre à un certain modèle. Je pense que le premier est plus sûr.
Le répertoire '. $ Myvar' existe-t-il déjà ou le créez-vous à la volée? –
@Pekka: Ce code ne crée rien à la volée. –
Est-ce que désinfecter toutes les entrées avec des filtres php, il devrait être plus que suffisant pour votre code. http://br.php.net/manual/fr/filter.filters.sanitize.php – B4NZ41