我试图做一个接受光栅图形和矢量图形文件的表单(它可以是:jpg、gif、psd、png、svg、eps、ai、cdr、pdf 等)并且我想避免恶意文件。
我发现的选项:
1)自定义功能过滤扩展:它似乎并不优雅 - 很多类型的扩展,也许我可以忘记一个 - 而且它似乎不太安全。或者是吗?
2)用于检查文件类型的getimagesize 函数:它不适用于矢量文件 - 至少这是我所理解的。还是我错了?
我没有在网上找到任何关于光栅+矢量文件形式的页面。该怎么办?
我试图做一个接受光栅图形和矢量图形文件的表单(它可以是:jpg、gif、psd、png、svg、eps、ai、cdr、pdf 等)并且我想避免恶意文件。
我发现的选项:
1)自定义功能过滤扩展:它似乎并不优雅 - 很多类型的扩展,也许我可以忘记一个 - 而且它似乎不太安全。或者是吗?
2)用于检查文件类型的getimagesize 函数:它不适用于矢量文件 - 至少这是我所理解的。还是我错了?
我没有在网上找到任何关于光栅+矢量文件形式的页面。该怎么办?
我的解决方案:
接收上传文件的 PHP 文件:
// get the name of original file
$imagem = $_FILES['arquivo']['name'];
// handle string to get extension in lower case. I think it is not a very secure handler.
$ext = strtolower(substr($imagem, strrpos($imagem, '.') + 1));
// array of extensions the validation accepts
$valid_ext = array ('ai', 'bmp', 'cdr', 'eps', 'gif', 'jpeg', 'jpg', 'pdf', 'png', 'psd', 'svg');
// checking
if(in_array($ext,$valid_ext)){
// file is ok. Do something
}
我尝试先用file types
, $file_info
,来检查 Mime finfo()
,getimagesize()
但其中任何一个都运行良好。我在识别 EPS 和 CDR 扩展时遇到了一些问题。它返回“application/octet-stream”,即未知扩展名的 Mime 类型文件。在我的研究中,我了解到是浏览器根据操作系统发送 Mime 文件类型信息,因此我们遇到了一个问题,即每个表单用户都可以为相同的扩展名拥有不同的 Mime 文件类型。
我也明白 PHP 有一个标准文件来识别 Mimes,但我无法处理该文件以添加有关 EPS 和 CDR 文件的信息。
所以我不得不使用那个字符串检查解决方案。