安全地允许通过 MIME TYPES / fil 上传网络字体(ttf、eot、svg、woff、otf)

Posted

技术标签:

【中文标题】安全地允许通过 MIME TYPES / fil 上传网络字体(ttf、eot、svg、woff、otf)【英文标题】:Safely allow upload of web fonts (ttf, eot, svg, woff, otf) via MIME TYPES / fil 【发布时间】: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 或许多其他可能危险的文件上传。

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

【问题讨论】:

【参考方案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 类型验证其内容

以上是关于安全地允许通过 MIME TYPES / fil 上传网络字体(ttf、eot、svg、woff、otf)的主要内容,如果未能解决你的问题,请参考以下文章

MIME Types MIME 类型

在哪里可以获得 mime.types 文件的副本? [关闭]

nginx mime.types 常用配置

PHP / Mime Types - 公开可用的 mime 类型列表? [关闭]

text mime_types

Nginx 无法打开 mime.types 。需要进行哪些更改?