La respuesta de ircmaxell no era del todo correcta. He visto esa solución en varios fragmentos pero tiene un error relacionado con la salida realpath()
. La función realpath()
elimina el separador de directorio de arrastre, así que imaginar dos directorios contiguos tales como:
/foo/bar/baz/
/foo/bar/baz_baz/
Como realpath()
eliminaría el último separador de directorio, el método podría volver "buen camino" si $_GET['path']
era igual a" ../ Baz_baz", ya que sería algo así como
strpos("/foo/bar/baz_baz", "/foo/bar/baz")
Tal vez:
$basepath = '/foo/bar/baz/';
$realBase = realpath($basepath);
$userpath = $basepath . $_GET['path'];
$realUserPath = realpath($userpath);
if ($realUserPath === false || strcmp($realUserPath, $realBase) !== 0 || strpos($realUserPath, $realBase . DIRECTORY_SEPARATOR) !== 0) {
//Directory Traversal!
} else {
//Good path!
}
MainMa entendió lo que estoy tratando de lograr. – Johnny
Presenta '$ _GET', está claro que está tratando de evitar un ataque transversal de directorio por parte de hackers, así que no digas" solo debes hacer que el php funcione correctamente en primer lugar ". – FluorescentGreen5