Php图像验证

时间:2011-08-31 16:31:46

标签: php image

因此,任何人都知道为什么这段代码对我不起作用

$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它将有效,我不应该

3 个答案:

答案 0 :(得分:2)

PHP的operator precedence使&amp;&amp;绑定比||更紧密,所以你的测试结果如下:

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

除此之外,请不要使用用户提供的['type']数据。伪造是完全无足轻重的,有人可以在上传nastyvirus.exe时设置为'image / gif'。

答案 1 :(得分: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

答案 2 :(得分: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库。)