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

Ale*_*art 5 php security file-upload

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

  1. 用户上传文件(包括.php文件在内的任何文件),将其重命名为md5哈希(删除扩展名)并存储在服务器上.创建了相应的mySQL条目.
  2. 用户试图下载文件,使用say download.php下载发送md5文件的文件(原始名称).

在某种程度上,任何人都可以利用上述场景吗?

Rit*_*iur 3

嗯,理论上没有。不应该有办法利用该系统。然而,有几件事我想向你指出,你可能没有想到。

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

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

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