最好的Mime类型方法

时间:2012-07-03 14:40:55

标签: php file-upload mp3 mime-types mime

确定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,第III层,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

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

2 个答案:

答案 0 :(得分:1)

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

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

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

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

但是,您可以检查客户端和服务器端。这样可以节省上传不良的带宽,但仍可以保护系统免受恶意用户的攻击。<​​/ p>

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

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

干杯。

答案 1 :(得分:0)

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