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 echoing 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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top