2009-05-11 13 views
7

Estoy implementando una secuencia de comandos de listado de directorios simple en PHP.Asegurar que una ruta definida por el usuario sea segura en PHP

Quiero asegurarme de que la ruta pasada es segura antes de abrir los identificadores de directorio y echo ing willy-nilly.

$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; 
     } 
    } 
} 

es esto suficiente para asegurarse una ruta enviada por el usuario es segura, o hay otras cosas que debería hacer para proteger contra el ataque?

+1

Tiene sus variables activadas en el foreach() – Greg

+0

: O Gracias por recoger eso ... –

Respuesta

9

Puede ser que realpath() sea útil para usted.

realpath() expande todos los enlaces simbólicos y resuelve referencias a '/./', '/../' y extra '/' caracteres en la ruta de entrada , y devuelve el nombre de ruta absoluto simplificado .

Sin embargo, esta función asume que la ruta en cuestión realmente existe. No realizará la canonización para una ruta no existente. En este caso, se devuelve FALSO.

+0

¿Realizo realpath() en la ruta pasada y compruebo si está debajo de mi directorio "seguro"? –

+0

Exactamente. Dado que obtiene una ruta sin sentido atrás (o FALSO), puede hacer una comparación de subcadena simple como el cheque. – Tomalak

+0

Me parece bien. ¡Gracias! –

Cuestiones relacionadas