因此,任何人都知道为什么这段代码对我不起作用
$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它将有效,我不应该
答案 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库。)