php - 如何验证使用 php 上传的文件不包含可执行二进制文件?

标签 php security

使用简单的 Firefox 插件,黑客可以更改他们想要上传的任何文件的 MIME 类型,绕过文件类型检查器。

然后,黑客可以使用 GIMP 等程序将 php 脚本嵌入到图像、音频或任何其他文件的二进制数据中。

如何检查并防止这种情况发生?

最佳答案

您可以使用mime_content_type () 来获取文件的实际 mime 类型,而不是客户端浏览器传输的值。

然后您可以使用诸如php-ClamAV之类的库允许在 PHP 中执行病毒扫描。

您可以放弃除您期望的文件扩展名之外的任何文件扩展名(例如,如果您需要图像,则为 .png、.jpg 等)。 在图像的特定情况下,您还可以通过修改图像来中和图像(例如稍微调整它们的大小、修改压缩率、修改数据并中和任何可执行文件)。

最后当然是不赋予文件执行权。但与评论中所说的相反,这并不能真正保护你。例如,如果黑客找到一种通过注入(inject)来运行 php 文件的方法,他将能够 chmod 该文件并获得正确的执行(甚至运行它)。

一个好的做法是始终以不可预测的方式重命名文件。如果上传后不打算让客户端访问,请将文件发送到禁用目录浏览的文件夹中。

关于php - 如何验证使用 php 上传的文件不包含可执行二进制文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13581425/

相关文章:

php - 如何添加编号或项目符号?

php - 模型中有什么...?

asp.net - 从谷歌等搜索引擎 Conceal 页面(如 Facebook 的安全设置)

javascript - 发送密码的散列而不是未散列的密码是个坏主意吗?

php - 如何使用 mysqli 在 php 中打印数据库中表的名称以及这些表中的列?

使用表单的 PHP HTTP 基本身份验证

javascript - 为什么这个被屏蔽的 JS 代码在 GET 参数 : '*alert(13)*' executed on my page?

ios - 从 base64 编码的字符串中获取 SecKeyRef

php - 如何获取我的表中的另一个表列?

java - 防止小程序打印安全警告