PHP Real文件类型

时间:2010-07-09 20:20:32

标签: php file mime-types

我正在建立一个用户可以上传mp3文件的网站。而且,我想检查文件是否是mp3文件。我需要知道的是,如果有一个php函数可以帮我这么做。

我尝试了$_FILES['uploadedfile']['type']

但是,我没有像我想的那样工作,因为它根据扩展名返回文件类型(我只在Windows上测试过)

所以,问题是:

  1. 有一种安全的方法可以使用php本机函数吗?
  2. 基于扩展名的文件类型是php问题还是与OS有关?
  3. 你向我推荐什么?
  4. 感谢。

5 个答案:

答案 0 :(得分:7)

  

1-使用php本机函数有一种安全的方法吗?

对于MP3,不是PHP本机功能,没有。

fileinfo使用操作系统的“MIME嗅探”功能。如果安装,它通常非常可靠。

或者,getID3库声称能够从MP3文件中提取信息。如果您可以从文件中获取播放时间,则可能是有效的MP3文件。

  

2-基于扩展名的文件类型是php问题还是与OS有关?

都不是。浏览器确定文件类型(通常根据扩展名)并发送MIME类型。与任何传入数据一样,它很容易伪造,永远不可信任。

答案 1 :(得分:3)

关于什么是MP3的问题有点毛茸茸。 MP3文件通常在开始和/或结束时包含一堆箔条,这些箔条不是有效的MP3帧。通常这是用于保存ID3标签,但由于其他原因(例如天真的流斩波),在末端遇到带有无意义数据的MP3并不罕见。

在实践中,几乎任何东西都可以是MP3,而且许多任意二进制文件都会有某些东西看起来像MP3框架。寻找ID3和长度信息(如在Pekka的答案中)是一个很好的启发式方法来了解一个文件是否可能是MP3,但如果您的想法是安全性,这是不够的 - 相关。

  

它根据扩展名返回文件类型(我只在Windows上测试过)

实际上它返回用户的Web浏览器发送的类型字符串,在Windows上将由原始文件扩展名确定,但在Mac或Linux上可能来自其他来源。无论哪种方式,如文件名本身,它都不值得信任。用户的计算机可能设置错误或可能故意为文件发送错误的媒体类型字符串。

  

使用php本机函数有一种安全的方法吗?

你对'安全'的意图是什么?如果您的目的是阻止人们伪装上传其他文件类型的MP3文件 - 通常是为了注入HTML,Java或Flash内容以进行跨站点脚本攻击 - 那么就没有现实的方法可以做到这一点。您可以制作有效MP3文件,但也可以同时解释为其他类型的文件。 (参见'GIFAR'攻击; MP3也是如此。)

最后,可靠地保护您免受XSS攻击的唯一方法是从不与主站点共享安全上下文的不同主机名提供不受信任的用户上载文件,因此跨站点脚本编写它不会带来任何好处。您也可以考虑使用部分解决方案,也可以使用Content-Disposition: attachment标题来提供所有文件(如果您不需要托管将在页面中内嵌显示的图像)。

答案 2 :(得分:2)

我会检查一下:

http://getid3.sourceforge.net/

您可以使用它来验证它是一个音频文件并获取有关它的信息。

答案 3 :(得分:1)

您想查看MIME类型。 PHP的fileinfo扩展名是执行此操作的首选方式。

答案 4 :(得分:1)

上传后打开文件并检查前几个字节,看它是否与mp3文件头中的内容匹配。