Je crée une visionneuse source PHP de base pour le dossier de code exemple de mon blog.Comment utiliser file_get_contents en toute sécurité?
<?php
if (isset($_GET['file']))
{
header('Content-type: text/plain');
$filename = realpath($_GET['file']);
if (startsWith($filename, dirname(__FILE__)))
{
echo file_get_contents($filename);
}
}
function startsWith($haystack, $needle)
{
$length = strlen($needle);
return (substr($haystack, 0, $length) === $needle);
}
?>
Est-ce que j'ai ici suffisamment qu'il ne permettra jamais un fichier en dehors du répertoire dans lequel ce script est situé, ou sous-répertoires du répertoire de ce script, être vu? Je suppose qu'il y a une meilleure solution que startsWith aussi, pour vérifier si un chemin est un descendant d'un répertoire particulier?
Mais 'realpath()' seule n'empêche pas de se lection d'un autre répertoire, il a donc toujours besoin de sa fonction 'startsWith()' pour vérifier si le fichier demandé se trouve dans le répertoire autorisé. Mais dans l'ensemble, la solution semble sauver. – feeela
@feeela: 'realpath' ne fait évidemment rien de ce genre - cela ne fait pas partie de la description de la fonction. Ce que je veux dire, c'est que le test 'startsWith' est quelque chose que tout le monde penserait faire, mais ce n'est pas sûr * par lui-même *. C'est la combinaison avec 'realpath' qui le rend sûr. – Jon