几年前,我贴an answer的一个问题有关的方式,在PHP中,让用户通过URI中的相对路径的文件下载,同时防止目录遍历。我的代码有什么安全问题?
我获得了一些意见,告诉该代码是不安全的,和几个downvotes(最近一次是今天)。下面的代码:
$path = $_GET['path'];
if (strpos($path, '../') !== false ||
strpos($path, "..\\") !== false ||
strpos($path, '/..') !== false ||
strpos($path, '\..') !== false)
{
// Strange things happening.
}
else
{
// The request is probably safe.
if (file_exists(dirname(__FILE__) . DIRECTORY_SEPARATOR . $path))
{
// Send the file.
}
else
{
// Handle the case where the file doesn't exist.
}
}
我再次审查代码,并再次,测试它,仍然无法理解有什么安全问题介绍了。
我在评论中得到的唯一提示是../
可以被%2e%2e%2f
取代。这不是问题,因为PHP会自动将它转换为../
。
这段代码有什么问题?什么可能是允许目录遍历或以某种方式破坏某些东西的输入值?
'/ etc/passwd'仍然被接受 – SLaks
@SLaks:URI http://example.com?path=/etc/passwd会给出类似'/ home/demo-site/etc/passwd的结果',所以不,这不是问题。 –
好问题。虽然它真的很痒,但我还是无法找到一个错误,而且它真的讨厌'/ etc/passwd'的建议,它使得所有的upvotes都在这里......而错误的是。安全性很好,但是因为..因为它不是很酷,所以把FUD放在了附近。我仍然不满意这个代码(为什么没有类型检查?限制它到某个白名单等),但事实是所有这个膝盖跳动也是不好的 – Nanne