2012-01-07 168 views
0

我試圖編寫上傳腳本,只接受上傳的PNG圖像。上傳腳本工作正常,但是當我添加png圖像檢測時,它會中斷。PHP上傳文件過濾

這是我如何把它設置了:

if ($_FILES) { 

     if ($_FILES["file"]["type"] == "image/png") { 

     $target_path = "uploads/"; 
     $target_path = $target_path . basename($_FILES['uploadedfile']['name']); 

     if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) { 
      echo "The file ". basename($_FILES['uploadedfile']['name']). 
      " has been uploaded"; 
     } else{ 
      echo "There was an error uploading the file, please try again!"; 
     } 

     } else { echo "Not A PNG…"; 

     } 

    } 

當我上傳PNG圖像,我得到「不是PNG」錯誤 - 任何想法?

+0

你確定它的PNG圖像,只有png格式的擴展而不是其他格式? – BartekR 2012-01-07 22:47:51

+0

是的,我查過了。 – Thomas 2012-01-07 22:54:16

+0

我意識到問題是由於名稱錯誤而導致缺少這種功能,但值得一提的是其他人已經提到,那裏提供的字符串不可信。這是絕對正確的,由於您沒有檢查關於該文件的其他任何信息,因此可以輕鬆地繞過此檢查以允許將任意代碼(或其他任何內容)上傳到您的系統。我建議採取其他措施來確保此上傳腳本的安全,否則在不久的將來可能會出現安全問題。 – 2012-01-08 00:00:54

回答

3

它看起來像你引用的文件錯誤的IF語句:

if ($_FILES["file"]["type"] == "image/png") { 

應該

if ($_FILES["uploadedfile"]["type"] == "image/png") { 

( 「文件」 需要 「的UploadedFile」)

+0

謝謝,我完全錯過了 - 一旦定時器啓動,我會檢查它。 – Thomas 2012-01-07 22:53:27

+2

此腳本不保證圖像*是* png圖像。 Mimetype可以輕鬆僞裝。 – 2012-01-07 22:53:28

+0

Srsly,這是問題嗎?大聲笑 - 順便說一句,如果你想使用PHP-GD的適當的PNG驗證,請參閱我的帖子下面,漂亮的眼睛@Ben D – Prof83 2012-01-07 22:56:17

2

我已經看到一些服務器不會在$ _FILES變量中添加MIME類型圖像/ png ...稍微有點CPU更重的方式:

if (@imagecreatefrompng($_FILES["file"]["tmp_name"]) 

如您使用的是GD庫打開圖像畫布

如果性能或缺乏GD庫是一個問題,簡單地檢查擴這裏的性能會略微降低:

if (strtolower(end(explode('.',$_FILES["file"]["name"])) == 'png') 

注意 如果你想使用的功能imagecreatefrompng,這將是最好確保GD安裝:if (function_exists('imagecreatefrompng'))


重要 如果你對內存的使用持謹慎態度(你應該)做

if ($image = @imagecreatefrompng($_FILES["file"]["tmp_name"]) { 
    // Do something 
    imagedestroy($image); 
    } 
2
  1. 切勿使用$_FILES[...]['type']什麼。它只是一個隨意的,用戶提供的字符串,它可能與實際文件沒有任何關係。
  2. 因此,請自己檢查MIME類型。
  3. 啓用error_reporting(E_ALL); ini_set('display_errors', true);,這將幫助您找到您的特定拼寫錯誤。
  4. 習慣不及格
  5. 2和4

例子:

if (!empty($_FILES['uploadedfile'])) { 
    if ($_FILES['uploadedfile']['error'] !== UPLOAD_ERR_OK) { 
     die('Error during upload'); 
    } 
    if (exif_imagetype($_FILES['uploadedfile']['tmp_name']) !== IMAGETYPE_PNG) { 
     die('Wrong file type'); 
    } 
    ... 
}