2011-08-31 72 views
2

因此任何人有,为什么这个代码不适合我PHP图片验证

$type1 = $_FILES['textfield2']['type']; 
$type2 = $_FILES['textfield3']['type']; 

if($type1 == 'image/gif' || $type1 == 'image/png' && $type2 == 'image/gif' || $type2 == 'image/png') 
{ 
    echo 'Valid'; 
    echo $type1.'<br />'.$type2; 
} 
else 
{ 
    echo 'Invalid'; 
} 

工作如果我选择第一档为ZIP或任何其他格式,然后接下来以PNG它会有效的任何想法是什么我不应该

+1

小心,在IE浏览器的一些“文件类型”是从FF的完全不同。我无法弄清楚为什么我的PNG文件无法正确显示,看起来它们是以'image/x-png'类型上传的。 – luckytaxi

回答

2

PHP的operator precedence使得& &绑定比||紧张,所以你的测试出来为:

if($type1 == 'image/gif' || ($type1 == 'image/png' && $type2 == 'image/gif') || $type2 == 'image/png') 
          ^----------------------------------------------^ 

除此之外,不使用用户提供的数据['type']此。伪造是非常微不足道的,而且有人可以在上传nastyvirus.exe时设置'image/gif'。

+0

那么,有没有解决办法怎么把我要验证图像的三个字段我甚至不能通过2,我有6种类型的文件格式来验证 – Henry

+0

使用getimagesize()。它会分析文件本身并告诉你它是什么。 –

+0

嗨不是图像大小验证,图像上传验证图像上传确认。 – tailor

1

尝试:

if(($type1 == 'image/gif' || $type1 == 'image/png') && 
    ($type2 == 'image/gif' || $type2 == 'image/png')) 
     { 
      echo 'Valid'; 

      echo $type1.'<br />'.$type2; 
     } 
     else 
     { 
      echo 'Invalid'; 
     } 

这是由于运算符优先级,这是记录在这里:http://php.net/manual/en/language.operators.precedence.php

+0

烨尼基这工作,我的傻瓜只是一个简单的事情,我抓我的头从过去的30分钟的特别感谢你怎么把ü回答第一个,它是RYT – Henry

1

这是由于operator precedence&&的优先级高于||所以在你的表达结果:

$type1 == 'image/gif' 
|| ($type1 == 'image/png' && $type2 == 'image/gif') 
|| $type2 == 'image/png' 

使用括号可以让你的意图明显:

($type1 == 'image/gif' || $type1 == 'image/png') 
&& ($type2 == 'image/gif' || $type2 == 'image/png') 

另外请注意,MIME类型是客户提供的数据,因此是非常容易操纵。相反,你应该检查是否有有效的GIF/PNG文件头(使用GD库的例子。)

+0

Yup Niki工作,我只是一个简单的事情,我从最近30分钟 – Henry