我想知道这种方法是否存在任何安全漏洞。我正在编写一段代码,允许用户上传文件,另一组代码下载这些文件。这些文件可以是任何文件。
是否有人可以利用上述情况?
答案 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)
我建议你将文件扩展名重命名为不可执行的文件扩展名,这样即使安全漏洞和某些人能够访问该文件,他们也无法执行它。除此之外,我没有看到任何人如何妥协安全性。