保护文件上传

4
我几年前为一家小公司写了一个网站,当时我正在学习。我意识到我的安全技能不如应该,最近这个网站被黑客攻击了,并且恶意的php代码通过一个本来用于上传图片的表单上传了上去。
我已经转向.NET世界,虽然我知道如何在.NET中保护文件上传,但我真的不知道如何使用PHP做到这一点。非常抱歉我不能提供任何源代码,因此我不指望有人会直接修复我的代码。
我希望有人能告诉我一个好的服务器端分析方法,以确保上传的$FILES数组内容实际上是图像或音频文件,或者至少不是php文件。

文件MIME类型可以使用mime_content_type()函数(相对可靠地)检测到。http://php.net/manual/en/function.mime-content-type.php - Michael Berkowski
请参阅http://www.php.net/manual/en/book.fileinfo.php。 - Michael Berkowski
@Michael - 但是对于安全性来说还不够可靠。仍然存在内容嗅探攻击、GIFAR攻击等风险。 - D.W.
@D.W. 这就是为什么我没有回答的原因。我没有时间进行全面的解释,但你的答案非常好。 - Michael Berkowski
1个回答

8
我很高兴你提出了这个问题。这是一个棘手的主题,很少有应用程序开发人员意识到安全风险。
我将为您总结一下应采取的方法,并提供一些阅读材料以了解更多信息。请务必阅读额外的阅读材料,因为我的摘要是不完整的。
摘要:
  1. 将用户上传的内容托管在一个单独的域名上。这是您可以采取的最重要和可靠的防御措施。

  2. 在上传文件时检查其MIME类型,以确保它在安全MIME类型的白名单中。生成一个新的随机文件名保存它。对于某些文件类型(例如图像),考虑重新编码它(例如转换为PNG或使用ImageMagick将其从其文件类型转换为相同的文件类型),因为这可能会击败一些攻击。

  3. 在下载/检索文件时,请确保将Content-Type:头显式设置为安全的MIME类型。还要设置一个X-Content-Type-Options: nosniff头。如果您不打算在浏览器中查看文件,则也发送一个Content-Disposition: attachment头,以使浏览器将其视为文件下载。

  4. 扫描文件上传以查找病毒或恶意软件。

阅读:


感谢您提供出色的答案。希望我能给它+2个赞 :) - havardhu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接