最佳 Mime 类型方法

Posted

技术标签:

【中文标题】最佳 Mime 类型方法【英文标题】:Best Mime Type Method 【发布时间】:2012-07-04 00:40:16 【问题描述】:

确定 mime 类型或文件类型的最佳方法是什么,阻止任何恶意通过并确保错误不会进入您的系统。

在我的示例中,我需要一种筛选方式,因此只需将 .mp3 上传到网站。现在我知道有 mime_content_type 但这会给出奇怪的结果,具体取决于文件的制作方式和您使用的浏览器,看到它从浏览器获取数据,至少我是这么理解的。

这是我使用 mime 类型进行识别的代码。

if(mime_content_type_new($_FILES["userfile"]) == 'audio/mpeg' )  do stuff  

然后是使用 unix 命令行并解释它

$fileinfo = exec("file -b 'song.mp3'"); echo $filinfo; 

这会输出类似这样的内容。

ID3 版本 2.3.0 的音频文件,包含:MPEG ADTS,第三层,v1, 192 kbps、44.1 kHz、立体声

这样我们就可以排序并检查它是否与我们的文件类型匹配。

$fileinfo = exec("file -b 'song.mp3'");
$filewewant = "MPEG";
$mpeg = stripos($fileinfo, $filewewant);
$filewewant = "layer III";
$mpeg3 = stripos($fileinfo, $filewewant);

if ($mpeg !== False & $mpeg3 !== False)
     echo "success"; ;

这种方式似乎工作得更好,不管扩展名是什么(例如它是否重命名为.png),但需要先保存文件然后排序,并且不适用于Windows。

我也被指向http://pear.php.net/package/MIME_Type

还有其他人有更好的方法吗?识别正在上传到服务器的文件的正确方法是什么?

【问题讨论】:

How to get the content-type of a file in PHP? 的可能重复项。话虽如此,我在这里欢迎更全面的答案...... 我在查找时没有看到那个,引用了 mime-types 分配,只是想找出随着时间的推移有哪些替代方案(查看日期) 【参考方案1】:

这可能不是一个证明解决方案(只是新/当前的浏览器),但新的 javascript FILE API 允许在不上传文件的情况下读取 MIME-TYPE。 对于任何服务器端验证,您必须上传文件 -> 并且您应该验证它们。

【讨论】:

【参考方案2】:

MIME 类型是(应该)通过查看文件的 MIME 标头获得的,该标头是文件开头的一段数据,指示 MIME。

这正是 mime_content_type_new 和您的 UNIX 命令正在做的事情,所以没有问题。 不确定你所说的“更好”的方式是什么意思,你做得对。

如果您因为浏览器问题而得到不同的 MIME 类型结果,您可能应该创建一个可接受值的数组并使用 in_array() 方法检查它。

我不建议将这样的 MIME 类型检查留给客户端代码,尤其是当安全性是一个大问题时。客户端可以访问代码,因此更容易被愚弄。

但是,您可以同时检查客户端和服务器端。这将为您节省带宽,避免上传错误,但仍能保护系统免受恶意用户的攻击。

这是关于 Javascript 的 FILE API 和使用 Javascript 处理图像的一个很好的教程。

http://www.html5rocks.com/en/tutorials/file/dndfiles/

干杯。

【讨论】:

感谢您的信息和教程。我喜欢双方的想法,为了安全而将其保留在服务器端是对的,而将其保留在客户端以限制带宽是正确的。没想到,哎呀。

以上是关于最佳 Mime 类型方法的主要内容,如果未能解决你的问题,请参考以下文章

如果我只有 MIME 类型,打开/编辑数据流的最佳方式是啥

网络视频的最佳 MIME 类型是啥?

PHP 上传 MIME 类型限制

在电子邮件中添加页脚文本的最佳方法是啥?

Tika检测文件类型

使用通用矢量大小类型的最佳方法是啥?