php - 保护文件上传

标签 php security file-upload

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

我已经转向 .NET 世界,虽然我知道如何在 .NET 中保护文件上传,但我真的不知道如何使用 PHP 来做到这一点。很抱歉,我无法提供任何源代码,因此我不希望任何人为我的代码发布任何直接修复。

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

最佳答案

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

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

总结:

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

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

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

  4. 扫描文件上传是否有病毒或恶意软件。

阅读:

关于php - 保护文件上传,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9354300/

相关文章:

php - 使用jquery php mysql提交数据?

php - PHP 中的安全随机数生成

jquery - 为什么 Blueimp 的 JQuery 文件上传会添加所有上一个文件。选定的文件,即使选项 [replaceFileInput : false] and [maxNumberOfFiles: 1] are set on init?

java - 如何请求root权限

python - 使用 Python 解析 .pcap 文件中的 SSL 流量

file-upload - 将小文件上传到 FastAPI 端点,但上传文件内容为空

tomcat - 长文件上传是否可以由一组 (Tomcat) 服务器处理,其中如果一台服务器在上传过程中失败/崩溃,另一台服务器会接替它

php - 如何在公共(public) header 中使用类="active"?

php - 在 PHP 中更新 MYSQL 表

php - Laravel Horizo​​n 抛出错误 : Call to undefined function Laravel\Horizon\Console\pcntl_async_signals()