检查上传的文件是不是在 php 中属于不安全的文件类型

Posted

技术标签:

【中文标题】检查上传的文件是不是在 php 中属于不安全的文件类型【英文标题】:Check if uploaded file is of a insecure filetype in php检查上传的文件是否在 php 中属于不安全的文件类型 【发布时间】:2012-05-20 20:29:25 【问题描述】:

我有一个文件上传表单,需要对上传的文件进行检查,以确保它不是可能导致服务器出现问题的任何内容(即:可执行文件)。这些文件主要是图像,但我将处理原始文件格式的其他扩展,可以是许多不同的扩展名。所以,我觉得最简单的方法是检查不是我不想要的事情列表,而不是我做的事情。

最好的方法是什么?理想情况下,可以在 Windows 和 linux 服务器上运行,但如果现在两者都适用,则主要是 linux。

【问题讨论】:

为什么可执行文件会对服务器造成风险?谁来执行他们? 考虑到白名单通常比黑名单更安全,并且潜在恶意扩展的数量远大于图像扩展的数量,我强烈推荐白名单。但是,我期待听到其他意见。 “允许”文件列表肯定会小于“不允许”文件列表 试试:php.net/manual/en/book.fileinfo.php 不一定,您可以尝试发送几行 php 代码来尝试执行一些 shell 命令或简单地显示数据库凭据,这将远小于中等大小的图像。 【参考方案1】:

我建议您应该维护允许类型的白名单,而不是阻止类型的黑名单。虽然treat any kind of file-extension based processing as a weak line of defence,因为绕过这种检查是微不足道的。

所以不要只检查文件扩展名。验证文件的内容类型是否与扩展名匹配可能值得 - 请参阅Fileinfo 扩展名。如果你只是使用图片,你可以use GD or ImageMagick to reprocess the file.

最后,我建议您将所有上传的文件存储在不允许执行的文件系统上 - 在 Linux/UNIX 平台上使用 noexec 挂载 - 但请注意isn't really an equivalent on Windows。

【讨论】:

+1 并且,在 PHP 中,content-type 和 mime-type 由客户端设置 -> 出于安全目的,这不是一个好的信息来源。 Fileinfo 扩展实际上会检查文件以获取内容类型。它仍然不是绝对可靠的,因为它只检查文件签名。我同意将这些数据信任客户端是一件坏事。

以上是关于检查上传的文件是不是在 php 中属于不安全的文件类型的主要内容,如果未能解决你的问题,请参考以下文章

PHP:检查动态添加的文件上传是不是为空

PHP检查文件是不是是图像[重复]

检查文件在php中是不是存在正则表达式[重复]

检查是不是存在上传的文件,显示按钮以查看和下载文件

使 ASP.Net 文件上传安全

检查 NFS 共享是不是在 PHP 中启动