这种代码方法存在安全漏洞

时间:2010-03-18 10:18:01

标签: php security file-upload

我想知道这种方法是否存在任何安全漏洞。我正在编写一段代码,允许用户上传文件,另一组代码下载这些文件。这些文件可以是任何文件。

  1. 用户上传文件(包括.php文件在内的任何文件),将其重命名为md5哈希(删除扩展名)并存储在服务器上。制作了相应的mySQL条目。
  2. 用户尝试下载该文件,使用say download.php下载发送md5文件的文件(原始名称)。
  3. 是否有人可以利用上述情况?

6 个答案:

答案 0 :(得分:3)

嗯,理论上没有。应该没有办法利用该系统。但是,我想向你指出一些你可能没有想过的事情。

首先,由于文件是通过PHP文件下载的(假设readfile()带有适当的标题),因此您应该将文件放在用户无法访问的位置。在apache服务器上,通常最简单的方法就是将.htaccess文件放入上传目录,并在其中“拒绝所有”,以防止外部访问。如果用户首先无法访问外部文件,那么实际上并没有担心文件扩展会造成麻烦(但是,出于存储目的而重命名仍然是一个好主意)

其次,通过哈希命名文件可能不是一个好主意,因为最终可能会发生冲突。如果两个文件碰巧有相同的哈希怎么办?更不用说,计算哈希有​​点慢,特别是对于较大的文件(如果从文件内容计算,而不是名称)。由于您将条目存储到数据库,我假设您在那里有某种主键(如auto_increment字段)。我建议只使用该ID号作为存储文件名以避免冲突(如果您不知道,可以通过mysql_last_insert_id()获取上次插入生成的ID)

当然,包含病毒的文件可能总是存在问题,这可能会感染机器下载文件,但这实际上超出了这个问题的范围,并且不会以任何方式影响服务器本身。

答案 1 :(得分:1)

如果他们可以include / require本地文件因为单独的漏洞是可预测的,那么是。

所以,基本上没有。 : - )

答案 2 :(得分:1)

只要没有人在服务器上执行这些文件,它就会非常安全。

答案 3 :(得分:1)

为了使下载按预期工作,您可能需要存储mime-type并在Content-Disposition标头中生成带有适当扩展名的文件名。这也意味着这些下载需要由PHP调解(因此您不能将它们放在open_base_dir之外)。

您应该检查您的代码,看看是否有任何方式可以包含上传的文件。

下进行。

答案 4 :(得分:0)

如果它是不同的扩展名,那么它不是默认的可执行文件并且有一个随机哈希值,保证不会被利用。只需确保不将PHP分配给扩展名。

答案 5 :(得分:0)

我建议你将文件扩展名重命名为不可执行的文件扩展名,这样即使安全漏洞和某些人能够访问该文件,他们也无法执行它。除此之外,我没有看到任何人如何妥协安全性。