几年前,我在一个与PHP有关的问题上发布了答案,介绍了一种方法,让用户通过URI传递相对路径以下载文件,同时防止目录遍历。
但是,有些评论指出这段代码存在安全漏洞,并且有一些人给了负评(最近的一次是今天)。以下是该代码:
我已经反复检查了代码并进行了测试,但仍然无法理解它引入的安全问题。
唯一在注释中得到的提示是
这段代码存在什么问题?输入的值可能会允许目录遍历或以某种方式破坏某些东西。
但是,有些评论指出这段代码存在安全漏洞,并且有一些人给了负评(最近的一次是今天)。以下是该代码:
$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会自动将其转换为../
。这段代码存在什么问题?输入的值可能会允许目录遍历或以某种方式破坏某些东西。
/home/demo-site/etc/passwd
的结果,因此不,这不是一个问题。 - Arseni Mourzenko/etc/passwd
建议真的很烦人...而且是错误的。安全性很好,但因为...嗯,因为不太酷而散布恐慌是不好的。我仍然对这段代码不满意(为什么没有类型检查?将其限制在某个白名单中等),但是出现这种膝反应的事实也很糟糕。 - Nanne$path = '/whatever/path/' + $_GET['path'];
开始,然后你可以删除遍历并确保它仍在正确的文件夹中。(虽然你可能仍然会遇到 "%2e%2e%2f" 的问题) - Matthew Wilcoxson/etc/password
将被附加到/var/www/mysite
或其他路径。你应该删除你的评论。 - SilverlightFox