阻止PHP中的目录遍历但允许路径

阻止PHP中的目录遍历但允许路径

我有一条基本路径/任何/foo/

$_GET['path']应该是相对的。

然而,我如何做到这一点(读取目录),而不允许目录遍历?

例如。

/\.\.|\.\./

不会正确过滤。


青春有我
浏览 912回答 3
3回答

浮云间

我在几个片段中看到了这个解决方案,但是它有一个与realpath()..这个realpath()函数移除尾随目录分隔符,因此设想两个连续目录,如:/foo/bar/baz/ /foo/bar/baz_baz/如realpath()将删除最后一个目录分隔符,如果$_GET['path']等于“./baz_baz”,因为它类似于strpos("/foo/bar/baz_baz", "/foo/bar/baz")也许:$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!}

FFIVE

仅仅检查./或类似的模式是不够的。以“./”为例,哪个URI编码为“%2e%2e%2f”。如果您的模式检查发生在解码之前,您将错过这一遍历尝试。黑客还可以做一些其他的技巧来绕过模式检查器,特别是在使用编码字符串时。正如ircmaxwell所建议的那样,我通过使用realpath()之类的方法将任何路径字符串规范化到其绝对路径,从而成功地阻止了这些事件。只有到那时,我才开始通过将遍历攻击与我预定义的基本路径相匹配来检查遍历攻击。
打开App,查看更多内容
随时随地看视频慕课网APP