Garantire un percorso definito dall'utente è sicuro in PHP
-
21-08-2019 - |
Domanda
Io sono l'attuazione di un semplice elenco di directory di script in PHP.
Voglio assicurare che il percorso passato è sicuro prima di aprire le maniglie di directory e echo
ing i risultati, volenti o nolenti.
$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;
}
}
}
E 'questo abbastanza per assicurarsi un percorso inviato dall'utente è sicuro, o ci sono altre cose che dovrei fare per proteggere contro l'attacco?
Soluzione
E 'possibile che realpath()
è utile a voi.
'/./'
si espande tutti i link simbolici e risolve i riferimenti a'/../'
,'/'
e <=> caratteri extra nel percorso di input e restituisce il canonicalized percorso assoluto.
Tuttavia, questa funzione presuppone che il percorso in questione effettivamente esiste. Non eseguirà canonizzazione di un percorso non esistente. In questo caso viene restituito FALSE.