如何检测 .docx 文件的正确 MIME 类型,而非 application/octet-stream?

8

我有一个网站,可以上传文档到服务器并将它们插入到MySQL表中。

在此过程中,服务器(通过PHP)检查文件类型以决定是拒绝还是保存文件。我通过发布以下代码来实现:

$_FILES ["file"] ["type"]

并确保其等于:

application/vnd.openxmlformats-officedocument.wordprocessingml.document

但是,在某些情况下,发布的文件类型似乎为:

application/octet-stream

这是因为客户端设备上没有安装MS Word吗?

如果是这种情况,是否验证application/octet-stream是否为允许的文件类型是不安全的?因为根据我的理解它是通用MIME类型,这意味着任何文件类型,包括.exe,都将被允许上传(无需说明这会造成什么问题)。

是否有其他方法可以验证.docx文件的类型,即使没有安装MS Word?或者出现这种情况的原因是什么?我已经看到其他网站允许从没有安装此类软件的移动设备上传.docx文件。

感谢您的帮助。


1
可能是在PHP中检测MIME类型的正确方法的重复问题。 - miken32
1
我已经查看了之前的帖子,那是一个不同的问题,因为它是关于如何验证/获取发布的文件类型,然而在我的情况下,文件被上传到PHP作为application/octet-stream,这是通用的,所以我的问题是为什么会这样,有什么解决方法,希望这足够清楚。 - Mostafa
1个回答

1
对于所有文件类型,您必须通过魔数。 Mime类型可以被攻击者修改。
代码必须读取接收到的文件的前3、4或5个字节,并与所需的魔数进行比较。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接