检查上传的文件是不是在 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 中属于不安全的文件类型的主要内容,如果未能解决你的问题,请参考以下文章