甚至PHP也有IE的“漏洞”

时间:2010-03-18 23:07:39

标签: php internet-explorer image upload mime-types

这不是一个真正的错误,但确定它不是你所期望的。 我有这个示例代码来上传图片:

if($type=="image/jpg" || $type=="image/jpeg" || $type=="image/pjpeg" || $type=="image/tiff" || $type=="image/gif" || $type=="image/png") {
   // make upload
else echo "Incorrect format ...."; 

问题在于,如果我修改图像的扩展名,让我们说.jpgq甚至.jpg%,我尝试上传它,FF和Chrome会说文件的类型是“application / octet-流“并且通常条件将是假的。

另一方面,IE会说文件的类型是“image / jpeg”,条件为true,文件将被上传。当然,任何试图稍后阅读图像的浏览器都无法这样做。

这不是一个错误,因为在msdn.microsoft.com上它说:“如果”建议“(服务器提供的)MIME类型未知(未知且不含糊),FindMimeFromData会立即返回此MIME类型”和“如果服务器提供的MIME类型已知或不明确,则会扫描缓冲区以尝试验证或从实际内容中获取MIME类型。”

我的问题是:

  1. 为什么IE /服务器在上传时知道真实的MIME类型但是它无法从服务器读取它?
  2. 如何解决此问题(如果文件没有正确的扩展名,条件必须为false)?检查扩展格式(而不是MIME类型)是否明智?
  3. 是不推荐使用的上述任何扩展程序?我应该加其他人吗?

2 个答案:

答案 0 :(得分:4)

忘记检查mime类型。请改用getimagesize()

答案 1 :(得分:0)

出于性能原因,您的网络服务器通常不会检查文件的mimetype,它通常只使用扩展名。

因此,在上传时,您需要阅读mimetype,然后如果您希望网络服务器直接提供文件,则使用适合mimetype的扩展名保存文件。另一种方法是使用下载包装器从文件中读取mimetype并将其传递到客户端。

基本示例,

/* verify and sanitize any file extension from mimetype
 */
    switch($subtype) {
    case 'pjpeg':
    case 'jpeg':
        if (!preg_match('/\.jp(e)?g$/i', $real_name)) {
            $real_name .= '.jpg';
        }
        break;

    default:
        if (!preg_match('/\.'.$subtype.'$/i', $real_name)) {
            $real_name .= ".$subtype";
        }
        break;
    }