【问题标题】:PHP 5.3.5 fileinfo() MIME Type for MS Office 2007 files - magic.mime updates?MS Office 2007 文件的 PHP 5.3.5 fileinfo() MIME 类型 - magic.mime 更新?
【发布时间】:2011-06-15 23:24:51
【问题描述】:

在 PHP 上传时,我正在尝试验证正在上传的文件的 MIME 类型,以匹配应用程序的一组有效 MIME 类型。当尝试使用 fileinfo() 来确定 Office 2007 文件的 MIME 类型时,它没有检测到其适当的 MIME 类型。相反,MIME 类型响应是“application/zip”

Office 文档 MIME 类型: http://filext.com/faq/office_mime_types.php

示例 PHP 代码:

$oFileInfo = new finfo(FILEINFO_MIME_TYPE);

$sMimeType = $oFileInfo -> 文件($_FILES['Filedata']['tmp_name']);

回声 $sMimeType;

服务器设置信息:

  • 操作系统:Windows Server 2003 32 位
  • 网络服务器:IIS 6.0
  • PHP:5.3.5(线程安全)使用 FastCGI 1.5
  • 文件:magic.mime
    • darko 在 uvcms dot com 的示例 2008 年 4 月 16 日 09:35
      • 链接:php.net/manual/en/fileinfo.installation.php
    • 大小:517 KB
    • 来源:Source Forge:GNU32 - FileType gnuwin32.sourceforge.net/packages/filetype.htm

我发现很多帖子都提到了从网络服务器下载时与较新的 Office 格式有关的问题。在所有这些示例中,我没有找到任何说明将新 MIME 类型添加到现有 magic.mime 文件的方法,或指向已经包含 Microsoft Office 2007+ MIME 类型的 magic.mime 文件的链接。感谢您的帮助。

【问题讨论】:

    标签: php mime-types detection


    【解决方案1】:
    1. 是的,你应该更新magic.mime
    2. 为不相信从浏览器发送的 mime 类型竖起大拇指 ($_FILES['Filedata']['type'])
    3. 为什么要使用手册上说不推荐使用的功能? http://php.net/manual/en/function.mime-content-type.php

    注意: finfo() 通过文件的魔法字节确定文件的 MIME 类型;鉴于 Office 2007 文件(以及许多其他文件格式,例如 ePUB)只是具有指定目录结构的 zip 包,因此使用 finfo() 返回 application/zip 是合理的。

    如果您真的想根据内容确定文件类型(而不是上传时浏览器报告的 MIME 类型),我建议您解压缩或列出内容以检查其结构

    【讨论】:

    • 使用“新 finfo(FILEINFO_MIME_TYPE);”当前(非弃用庄园)对吗? mime_content_type() 函数实际上是我所理解的已弃用。
    • 问题当然是,如何更新magic.mime文件,有什么线索吗?
    【解决方案2】:
    1. 是的,您应该更新 magic.mime。

    大声笑,是的,只需更新它,问题就解决了。 不幸的是,看起来神奇的 mime 类型系统无法查看实际文件内容,并且由于文件已压缩,它无法解压缩(查看哪个文件?)

    例如,有人建议编写一个函数来解压缩压缩文件,然后检查“DocProps”目录是否存在。但这会给生产服务器带来另一个攻击向量。

    【讨论】:

    • 在这里,我认为微软正在整理东西以提高安全性。 :-)
    【解决方案3】:

    较新的 Office 文件实际上是 ZIP 档案。这就是 MIME Magic 数据库将它们检测为 ZIP 文件的原因。您可能需要根据文件扩展名添加特殊规则,或查看 ZIP 文件以查看它是否有 docProps 文件夹(Office ZIP 档案有这样一个文件夹,其中包含有关文档的元数据)。

    还有其他文件格式实际上是具有不同扩展名的 ZIP 存档,例如JAR 文件。

    【讨论】:

    • jmz,是的,我知道它们是 ZIP 档案。但是,在以下位置可以找到 MIME 类型:filext.com/faq/office_mime_types.php 用于 Office 2007+ 文件。我很确定我需要一个可以检测到这些的更新的 magic.mime 文件。如果找不到更新的magic.mime,则可以将实际的magic.mime 行添加到我现有的magic.mime 文件中,用于各种Office 2007+ 扩展。
    • 某事告诉我,magic.mime 文件的语法和方法并不为许多人所知,因为似乎没有人知道解决方案。我发现了很多帖子,人们说不要弄乱你的 magic.mime 文件,以免损坏它。可悲的是,他们都没有指出学习文件如何工作的地方。
    【解决方案4】:

    您是否尝试将新的 mime 类型添加到 IIS 中?

    1. 访问 Internet 管理插件
    2. 右键单击“网站”并选择“属性”
    3. 选择“HTTP 标头”
    4. 选择“Mime 类型”
    5. 输入一个没有前导句点的新扩展名和适当的 MIME 类型。根据需要为每个扩展重复。
    6. 点击“确定”关闭所有对话框

    【讨论】:

    • 抱歉 Twister,但问题不在于 Web 服务器。问题是验证正在上传的实际文件的 MIME 是否有效。
    • 是的,但 php 可能正在使用网络服务器 mime 表来识别文件 mime 类型。
    • 如果 PHP Fileinfo finfo() 使用的不是它设置使用的 magic.mime 文件,我会非常惊讶。但是,通过在 IIS 上使用 .docx 和 .xlsx MIME 类型添加 MIME 类型进行测试后,情况没有改变。
    猜你喜欢
    • 2010-09-05
    • 2011-12-26
    • 2011-10-18
    • 2010-11-30
    • 1970-01-01
    • 2012-10-18
    • 2011-12-14
    • 1970-01-01
    • 2010-09-08
    相关资源
    最近更新 更多