用户是否在PHP中提交了头文件名安全漏洞?

时间:2016-02-15 16:26:15

标签: php security code-injection

我想动态生成一个可下载的文本文件,PHP只包含一个md5哈希字符串。

用法:index.php?filename = myhash.txt& hash = 8145c8f6d42fda2c3cfdd1d091bcb331

$filename = isset($_GET["filename"]) ? $_GET["filename"] : "md5.txt";
$hash = (isset($_GET["hash"]) && preg_match('/^[a-f0-9]{32}$/', $_GET["hash"])) ? $_GET["hash"] : "";

header("Content-type: text/plain");
header("Content-Disposition: attachment; filename=$filename");
echo $hash;

我关注的是标头中使用的$filename,任何人都可以修改。这是一个安全漏洞吗?

2 个答案:

答案 0 :(得分:3)

我合理地确定这并不存在任何安全问题,但请插入一般性免责声明,说明证明消极方面有多难。

您没有使用文件名来访问服务器的文件系统,因此您不会受到文件包含攻击的攻击。<​​/ p>

您可以限制文件的内容,因此您的用户应该不会被欺骗下载脚本,但不管怎样,让我们​​采取假设:

给定一种编程语言,其中只能使用匹配[a-f0-9](这意味着没有空格)的字符编写程序,并且程序可以用其中的32个字符编写,然后攻击者可以编写显示在您网站上(因此值得信赖)的网址,该网址会导致下载名为something.xyz的文件。 (对于xyz的值,该值被注册为使用该语言编写的脚本的文件扩展名。)这会导致攻击者的程序被下载到用户可能双击它并执行的某个地方它

这是一个非常不可能的案例,现代操作系统非常善于将下载的文件标记为需要&#34;您确定要执行此操作吗?&#34;警报,所以这是一个严重的边缘情况。

要偏执,您可能希望将文件名限制为包含.txt.md5扩展名的文件名。

特殊字符可能是问题,但我无法想到任何安全风险。例如,如果在文件名中输入了一个新行,那么现代版本的PHP可能会抛出以下内容:

  

警告:标题可能不包含多个标题,第4行/Users/david/tmp/hfjkljiwe/index.php中检测到新行

...并阻止脚本输出内容处置标题。

不要运行old versions of PHP,安装您的安全修复版本!

从另一方面来说,浏览器不太可能接受他们正在写入的文件系统将会摇摆不定的文件名。

也就是说,在编写安全软件时,偏执狂从未对任何人造成任何伤害(特别是当它必须与其他软件交互时 - 软件有错误!),因此对什么字符添加一些限制在文件名中被允许不是一个坏主意。

答案 1 :(得分:0)

据我所知,理论上你可以做到这一点;因为您实际上从未真正访问过服务器上的任何文件,所以没有人可以对您的服但是,有可能为他们的操作系统提供无效的文件名,我不完全确定会发生什么。鉴于它将以任何一种方式弹出下载对话框,让它们在那时输入文件名而不是允许它们事先输入它似乎更安全。