【发布时间】:2016-02-15 04:12:56
【问题描述】:
我想创建一个上传脚本,我想定义一些允许上传的文件类型,以防止通过重命名文件扩展名来欺骗我使用这个数组:PHP / Mime Types - List of mime types publically available? 首先它检查是否允许文件扩展名(例如 .xsl),然后它使用 finfo 获取 mimtype 以检查该数组以查看 mimetype 是否与扩展名匹配。
我上传了一个 .xsl 文件,finfo 将文件类型返回为 application/octet-stream,但该 xsl 扩展数组返回 application/x-msexcel,因此它不会相等且不会被验证。
我真的应该忘记与脚本的文件扩展名验证器匹配的 mimetype 并且我应该只检查文件扩展名吗?或者我该怎么办?
【问题讨论】:
-
你是如何保证文件类型是“application/octet-stream”的,如果你在文件数组中这样做,它是不可靠的,它很容易被伪造。如果没有识别到文件类型标题“application/octet-stream”,则发送。这并不并非总是意味着上传的文件属于这种类型。您应该检查上传的文件,而不是 mime 类型的 $_FILES 数组
-
八位字节流从 finfo::buffer 返回。然后我从数组中得到了 xsl 扩展的 mimetype,它是 x-msexell,所以它们不相等。我应该如何针对扩展验证文件 mimetype 以避免重命名技巧?只允许提供的扩展名列表,以便有人可以重命名并上传它。如何验证?
-
好吧,我想你给了我线索。我正在使用 finfo::buffer 所以不可靠,我将其更改为带有物理文件的 file_open ,现在它返回 application/vnd.ms-excel 而不是 octet-stream 如预期的那样。但现在还有一个问题:当我将文件名重命名为 .txt 以欺骗上传时,如何验证这是否是允许的文件?我应该使用 array_exists 来传递这种类型以将数组键作为 .xsl 来查看这是不允许的吗?
-
我认为,这就是验证的重点。如果 mime 类型是 application/vnd.ms-excel 它必须是具有 excel 扩展名的文件,否则您的 mime 类型检查将只有“一半”安全:)
-
我通过加入以下所有列表 + .php 扩展名创建了这个数组 pastebin.com/d4ZQBe5A 或 gist.github.com/nimasdj/801b0b1a50112ea6a997,所有这些列表都缺少。请为此列表做出贡献,以使其尽可能准确和完整。 gist.github.com/plasticbrain/3887245pastie.org/5668002pastebin.com/iuTy6K6d 总计:截至 2015 年 11 月 16 日,共有 1223 次延期
标签: php mime-types mime file-type