我有一个Symfony 2.7项目。
最近我抱怨客户不能再上传.pptx
和.docx
文件了
经过一番研究,我发现这是为了防止不需要的文件上传而检查的mime类型。
由powerpoint和Word制作的.pptx
和.docx
文件被正确上传并具有正确的mime类型(application/vnd.ms-powerpoint
和application/msword
),但在Pages和Keynote中创建的文件然后导出到.docx
/.pptx
具有application/octet-stream
或application/zip
的mime类型(取决于Symfony的MimeTypeGuesser使用)。默认情况下使用FileinfoMimeTypeGuesser
,它内部调用finfo
返回application/octet-stream
。第二个猜测者,FileBinaryMimeTypeGuesser
,返回application/zip
(我相信有人使用file --mime
)。
当我在这些文件上运行file --mime
时(在我的Vagrant上是CentOS 7和我的Mac上),我得到这些结果:
的流浪汉:
[vagrant@localhost ~]$ file --mime keynote_pptx_test.pptx
keynote_pptx_test.pptx: application/zip; charset=binary
[vagrant@localhost ~]$ file --mime powerpoint_pptx_test.pptx
powerpoint_pptx_test.pptx: application/vnd.ms-powerpoint; charset=binary
本地:user@MacBook-Pro $ file --mime keynote_pptx_test.pptx
keynote_pptx_test.pptx: application/zip; charset=binary
user@MacBook-Pro $ file --mime powerpoint_pptx_test.pptx
powerpoint_pptx_test.pptx: application/zip; charset=binary
显然,出于安全原因,我不想启用application/zip
上传。
默认的mime类型猜测器(FileinfoMimeTypeGuesser
)返回application/octet-stream
。我不确定是否我想启用mimetype上传,也是出于安全原因。
我能做些什么来让这些上传发生,比如检查mimetype不同(也许Symfony中有更多的猜测者?),或者我应该启用application/octet-stream
(如果是这样,安全影响是什么),或者只是苹果的软件需要改进?
Carlos Granados的评论就是答案:
顾名思义,MimeTypeGuesser只是"猜测"MimeType。从我的经验来看,找到合适的哑剧类型真的很难对于来自许多不同来源的文件,因此您将需要结束打开你接受的类型的范围。如果你担心关于安全性,您总是可以对这些文件应用更多的测试,例如示例:使用docx解析器验证它是一个真正的docx文件