La risposta di ircmaxell non era completamente corretta. Ho visto questa soluzione in diversi frammenti ma ha un bug relativo all'output di realpath()
. La funzione realpath()
rimuove il separatore di directory finale, quindi immaginate due directory contigue quali:
/foo/bar/baz/
/foo/bar/baz_baz/
Come realpath()
sarebbe rimuovere l'ultimo separatore di directory, il metodo sarebbe tornato "buona strada", se $_GET['path']
è stato pari a" ../ Baz_baz", come sarebbe qualcosa di simile
strpos("/foo/bar/baz_baz", "/foo/bar/baz")
Forse:
$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!
}
fonte
2012-11-25 14:47:12
MainMa ha capito cosa sto cercando di ottenere. – Johnny
Fa comparire '$ _GET', è chiaro che sta cercando di impedire un attacco di directory trasversale da parte di hacker, quindi per favore non dire" dovresti semplicemente far funzionare correttamente il php in primo luogo ". – FluorescentGreen5