处理上传的文件时,$_FILES [‘foo’] [‘type’]完全不可靠.我发现如果你在OS X上更改扩展名,’type’会自动更改.
而是考虑:
$fileInfo = new \finfo(FILEINFO_MIME);
$mimeType = $fileInfo->buffer(file_get_contents($_FILES['foo']['tmp_name']));
$mimeType = explode(';', $mimeType);
现在,如果我将PHP脚本重命名为.jpg并上传它(在OS X 10.10上)$_FILES [‘foo’] [‘type’] = image / jpeg和$mimeType = text / x-PHP.
文件类型可以很容易地改变,但PHP的finfo :: buffer如何被欺骗? PHP检查$_FILES [‘foo’] [‘type’]和finfo(FILEINFO_MIME)之间有什么区别?
解决方法:
PHP不检查$_FILES类型中的任何内容;在上传文件时,发送浏览器正在发送它认为文件类型的元数据. $_FILES [‘file’] [‘type’]仅反映浏览器上传的此值.显然,任何人都可以随意欺骗.
Finfo使用magic database,它只是识别文件类型特征的集合.即,所有JPEG文件都有一个特征标题,所有ZIP文件都以某种方式启动,这种文件类型具有这些前导字节数,该文件类型具有这些类型的尾随字节等.如果你真的这么做很难欺骗想要生成某种类型的有效文件,但绝不是不可能的.