2010-07-09 44 views
5

我正在构建一个用户可以上传mp3文件的网站。而且,我想检查该文件是否是mp3文件。我需要知道的是,如果有一个PHP函数可以帮助我。PHP真实文件类型

我试图$_FILES['uploadedfile']['type']

但是,我不是那样想的,因为它返回一个基于扩展名的文件类型(我测试了它只能在Windows上)

所以,问题是:

  1. 有一种安全的方式来做到这一点与PHP本地功能?
  2. 基于扩展名的文件类型是PHP的问题还是与操作系统有关?
  3. 你对我有什么建议?

谢谢。

+0

[如何检查文件是图像还是视频类型在PHP版本5.2.9?](http://stackoverflow.com/questions/3074527/how-to-check-whether-file-is-image-or -video-type-in​​-php-version-5-2-9)对于getID3覆盖了相同的理由 – Gordon 2010-07-09 21:11:45

回答

7

1-有一个安全的方法来做到这一点与PHP本地功能?

对于MP3,不支持PHP本机功能,不支持。

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

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

2-基于扩展名的文件类型,是PHP的问题还是与操作系统有关?

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

+1

+1。我之前使用它来检查QuickTime影片是否包含流式提示。非常非常有用。 – 2010-07-09 20:30:33

1

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

1

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

+0

前几个字节也可以是ID3 – 2010-07-09 20:48:30

+0

我没有说前几个字节可能是什么,所以我不知道这是如何适用于我的答案。你确定你不是认为这是对其他回答之一的答复吗? – GrandmasterB 2010-07-09 20:55:13

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标头(如果您不需要托管在页面上以内联方式显示的图像)提供所有文件。

+0

是的,我不知道。我总是看到youtube如何让你上传任何东西,但如果不是视频,它说你“对不起”。我认为我有很多我想要的信息。谢谢。 – mRt 2010-07-10 15:33:24