Certifique-se de um caminho definido pelo usuário é seguro em PHP
-
21-08-2019 - |
Pergunta
Estou implementando um diretório simples listagem de script no PHP.
Eu quero garantir que o caminho passado é seguro antes de alças de diretório abertura e echo
ing os resultados à toa.
$f = $_GET["f"];
if(! $f) {
$f = "/";
}
// make sure $f is safe
$farr = explode("/",$f);
$unsafe = false;
foreach($farr as $farre) {
// protect against directory traversal
if(strpos($farre,"..") != false) {
$unsafe = true;
break;
}
if(end($farr) != $farre) {
// make sure no dots are present (except after the last slash in the file path)
if(strpos($farre,".") != false) {
$unsafe = true;
break;
}
}
}
Isso é suficiente para certificar-se de um caminho enviado pelo usuário é seguro, ou existem outras coisas que eu deveria fazer para proteger contra o ataque?
Solução
Pode ser que realpath()
é útil para você.
realpath()
expande todos os links simbólicos e resolve referências a'/./'
, caracteres'/../'
e'/'
extra no caminho de entrada, e os retornos canonicalized caminho absoluto.
No entanto, esta função assume que o caminho em questão realmente existe. Ele não executará canonização para um caminho não existente. Neste caso FALSE é retornado.