确保文件上传安全


Securing file upload

几年前,我在学习时为一家小公司写了一个网站。我意识到我的安全技能并没有达到应有的水平,最近该网站被黑客入侵,恶意php代码被使用一个用于上传图像的表单上传。

从那以后,我进入了.NET世界,虽然我知道如何在.NET中保护文件上传,但我真的不知道如何使用PHP。很抱歉,我不能提供任何源代码,因此我不希望任何人发布任何直接修复我的代码。

我希望有人能向我展示一种很好的服务器端分析方法,以确保上传的$FILES数组内容实际上是一个图像或音频文件,或者至少它不是php文件。

很高兴你问我。这是一个棘手的问题,很少有应用程序开发人员意识到安全风险。

我会给你总结一下你应该采取的方法,并通过阅读来了解更多。请务必阅读附加阅读,因为我的摘要不完整。

摘要:

  1. 将用户上传的内容托管在一个单独的域上。这是你能采取的最重要、最可靠的防御措施。

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

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

  4. 扫描上传的文件中的病毒或恶意软件。

读数:

  • 应该采取哪些步骤来验证应用程序中用户上传的图像?

  • MIME嗅探保护

  • 存储和重放用户提供的mime类型是否安全?

  • 仅在白名单MIME内容类型下为任何用户上传的文件提供服务是否安全?