我有一个基本路径 /whatever/foo/
and
$_GET['path']
应该是相对的。
但是,如何在不允许目录遍历的情况下完成此操作(读取目录)?
eg.
/\.\.|\.\./
无法正确过滤。
好吧,一种选择是比较真实路径:
$basepath = '/foo/bar/baz/';
$realBase = realpath($basepath);
$userpath = $basepath . $_GET['path'];
$realUserPath = realpath($userpath);
if ($realUserPath === false || strpos($realUserPath, $realBase) !== 0) {
//Directory Traversal!
} else {
//Good path!
}
基本上,realpath() http://php.net/manual/en/function.realpath.php将解析提供的路径到实际的硬物理路径(解析符号链接,..
, .
, /
, //
等)...因此,如果真实的用户路径不是以真实的基本路径开头,则它会尝试进行遍历。请注意,输出realpath
will not有任何“虚拟目录”,例如.
or ..
...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)