【问题标题】:Safely allow upload of web fonts (ttf, eot, svg, woff, otf) via MIME TYPES / fil安全地允许通过 MIME TYPES / fil 上传网络字体(ttf、eot、svg、woff、otf)
【发布时间】:2011-09-05 06:25:30
【问题描述】:

我正在尝试通过检查 mime 类型来允许在我们的应用程序中安全上传网络字体。这适用于我们允许的大多数类型的文件,但对于网络字体来说这是一个问题。

我们使用 PHP 的 http://php.net/manual/en/book.fileinfo.php 来检查 mime-type

问题在于 php 会将所有 Web 字体检测为 mime “application/octet-stream”,但如果允许这样做,将允许 .exe 或许多其他可能危险的文件上传。

处理此类文件上传的最佳方式是什么?

【问题讨论】:

    标签: php linux mime-types


    【解决方案1】:

    找到一个包含字体格式信息的魔法文件,并将其传递给finfo_open()

    【讨论】:

    • 在 /usr/share/ 中找到了该文件,如何使用字体格式更新该文件?
    • 从最新的file 获取。您需要运行configure,然后进入magic/ 并在那里运行make 以生成文件。
    • 问题是我们正在运行 CentOS 并且不想绕过 yum
    • 你不需要。只需将您的魔法文件放在其他地方并明确引用它。
    • 好的,谢谢,我会试试的。是否有版本文件说明文件命令magic.mime 文件中支持哪个版本的网络字体?
    【解决方案2】:

    我不依赖 PHP 中内置的 mime 检查器。我总是和他们有问题。如果你运行的是 linux,使用 PHP 的 exec 命令在 bash 中执行 mimetype 命令并返回给 PHP。

    【讨论】:

    • 这将是一个选项,但我们必须在 PHP 中打开 exec,出于安全目的,它现在被阻止
    【解决方案3】:

    你应该使用phpinfo检查扩展名,mime类型可以是假的,你可以得到一个pdf的mime类型的.php文件。

    编辑

    $file = "abc.ttf";
    
    if(in_array(strtolower(pathinfo(file, PATHINFO_EXTENSION)), array("ttf")))
    {
        // OK
    }
    

    你可以为数组添加更多扩展

    【讨论】:

    • 您如何可靠地检测 TTF 文件,您是否有示例或链接说明如何完成该操作?
    • 我已经在我的 anwser 中添加了一个示例
    • 谢谢,但如果我将文件 abc.ttf 重命名为 abc.exe,这会给我“exe”
    • 是的,但这是最安全的方法。
    • 如果用户可以简单地重命名文件并将任何内容上传到服务器,这怎么可能是最安全的方式。至少 MIME 类型检查文件的实际内容,使其比仅检查文件扩展名更安全?
    【解决方案4】:

    如果 TTF 文件是唯一允许上传的文件,请使用: http://www.phpkode.com/scripts/item/ttf-info-plus/

    【讨论】:

    • 还有 OTF、SVG 和其他网络字体需要上传。事实上,我们希望将来能够允许任何类型的文件,只要我们至少可以根据 MIME 类型验证其内容
    猜你喜欢
    • 2014-10-26
    • 2021-08-02
    • 1970-01-01
    • 2021-06-08
    • 2017-06-05
    • 2012-06-15
    • 2016-06-27
    • 2014-11-28
    相关资源
    最近更新 更多