MIME 类型检测是检测一种文件的最佳方法吗?


Is MIME type detection the best way to detect a kind of file?

我正在用PHP制作一个上传表单,该表单必须只允许MP3文件。

上传完成后,我分析文件以检查它是否真的是 MP3。第一步是将 MIME 类型检测为 audio/mpeg .我finfo_file()使用这些库并且工作正常,除了在测试期间某些 MP3 文件被拒绝,因为它们的 MIME 类型结果为 application/octet-stream .

我的问题是:

  • 我的应用程序绝对应该拒绝这些 MP3 文件吗?他们实际上播放音频。
  • 这种MIME类型是MP3有什么原因吗?
  • 检测 MIME 类型是了解文件类型的最可靠方法吗?

在大多数需要上传的应用程序中,我有时会根据预定义的 MIME 类型列表验证浏览器(客户端)传递的 MIME。这种方法做了一个一般的假设,如果发生了可疑的事情,浏览器无法传达正在上传的文件的MIME类型,我可能不想在这个时候费心处理它。

<?php
$valid_mp3_mimes = array(
    'audio/mpeg',
    'audio/x-mpeg',
    'audio/mp3',
    'audio/x-mp3',
    'audio/mpeg3',
    'audio/x-mpeg3',
    'audio/x-mpeg-3',
    'audio/mpg',
    'audio/x-mpg',
    'audio/x-mpegaudio',
    'video/mpeg',
    'video/x-mpeg',
);
$uploaded_file_mime = $_FILES['upload_field_name']['type'];
if(!in_array($uploaded_file_mime, $valid_mp3_mimes))
{
    die('Upload is not a valid MP3 file.');
}

您可能认为这足以满足您的目的,也可能不认为这是足够的方法。PHP 手册明确指出,如果浏览器提供了此信息,则此信息可用,并且服务器端未检查 MIME 类型,因此不应被视为理所当然。

要考虑的一件事是服务器上资源的可用性,这些资源允许您对文件的真实 MIME 类型进行身份验证。

作为PHP开发人员,我们喜欢在大多数情况下创建独立于平台的代码的灵活性(例如,我们在运行XAMPP的Windows系统上构建的Web应用程序可以部署到Linux托管环境中,只需很少的修改)。但是,在验证 MIME 类型时,我们开始引入依赖于平台的方法,这些方法需要验证这些工具是否存在(例如"file"或"finfo_file")。

这可能是一个值得研究的实现(取自 CodeIgniter GitHub 存储库),它利用了这些工具,并且与你将在 PHP 范围内获得的工作示例一样全面:

如果可能,文件 MIME 类型会检测上传文件的(实际)MIME 类型。https://github.com/EllisLab/CodeIgniter/blob/develop/system/libraries/Upload.php#L983


来源

PHP手册开机自检方法上传 - http://www.php.net/manual/en/features.file-upload.post-method.php

网站站长工具包哑剧类型 - http://www.webmaster-toolkit.com/mime-types.shtml

文件xt.MP3文件 - http://filext.com/file-extension/MP3

如果您想要一种非常可靠的方法来检测文件类型,而不仅仅信任客户端提供正确的 MIME 类型,请使用 UNIX 上的文件实用程序。

$ file Black' Sands' 01' Prelude.mp3
Black Sands 01 Prelude.mp3: Audio file with ID3 version 2.2.0, contains: MPEG ADTS, layer III, v1, 320 kbps, 44.1 kHz, Stereo
$ file homework/math475-hw8.docx
homework/math475-hw8.docx: Microsoft Word 2007+

在 PHP 中,您可以使用 exec 函数来调用它。

除了 MIME 之外,文件检测的最佳方法是使用"魔术字节"或"幻数"方案。Unix file(以及finfo_file)实际上使用"魔术字节"来执行此文件检测。所以,简而言之:是的。

不要太担心你的文件是什么样子的,更多的是你可以用它做什么。只要它播放,文件应该没问题。

如果你真的想做更多,你可以自己检查魔术字节。这里有一个列表。