2011-08-31 73 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