2009-10-23 94 views
1

嗨,我試圖上傳一個圖像使用PHP腳本。和什麼很奇怪的是我只在Internet Explorer中收到以下錯誤地方有什麼腳本正常工作:PHP中的文件上傳問題

Warning: move_uploaded_file(pictures/) [function.move-uploaded-file]: failed to open stream: Is a directory in /home/tntauto1/public_html/admin_add1.php on line 59 

Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move '/tmp/phpcJnHZE' to 'pictures/' in /home/tntauto1/public_html/admin_add1.php on line 59 

Warning: copy() [function.copy]: The first argument to copy() function cannot be a directory in /home/tntauto1/public_html/admin_add1.php on line 60 

下面是腳本:

if(is_uploaded_file($_FILES['image']['tmp_name'])){ 
    if($_FILES['image']['type'] == 'image/jpeg'){ 
     $original = 'original_'.$v_id.'.jpg'; 
     $large = 'large_'.$v_id.'.jpg'; 
     $small = 'small_'.$v_id.'.jpg'; 

    }elseif($_FILES['image']['type'] == 'image/gif'){ 
     $original = 'original_'.$v_id.'.gif'; 
     $large = 'large_'.$v_id.'.gif'; 
     $small = 'small_'.$v_id.'.gif'; 
    }else{ 
     $error = 'Error: The image could not be uploaded. It must be in .jpg, .jpeg or .gif format.'; 
    } 
    if(move_uploaded_file($_FILES['image']['tmp_name'],'pictures/'.$large)){} 
     copy('pictures/'.$large,'pictures/'.$small); 

    $imgsize = getimagesize('pictures/'.$large); //>>>>>>>>>>>>>>>>>>>>>>>>>>>>---- Resize to 480 X 360 
    $width = $imgsize[0]; 
    $height = $imgsize[1]; 
    if(($width > 480) || ($height > 360)){//resize the image 
     $ratio = $width/$height; 
     if(100/$ratio >= 80){//calculates if height of uploaded image is too large 
      $new_width = floor(360 * $ratio); 
      $new_height = 360; 
     }elseif(150 * $ratio > 100){// calculate if width of uploaded image is too large 
      $new_width = 480; 
      $new_height = floor(480/$ratio); 
     } 
     if($_FILES['image']['type'] == 'image/jpeg'){ 
      $img = imagecreatefromjpeg('pictures/'.$large); 
      $img_copy = imagecreatetruecolor($new_width,$new_height); 
      imagecopyresampled($img_copy,$img,0,0,0,0,$new_width,$new_height,$width,$height); 
      imagejpeg($img_copy,'pictures/'.$large,100);  
     } 
     if($_FILES['image']['type'] == 'image/gif'){ 
      $img = imagecreatefromjpeg('pictures/'.$large); 
      $img_copy = imagecreatetruecolor($new_width,$new_height); 
      imagecopyresampled($img_copy,$img,0,0,0,0,$new_width,$new_height,$width,$height); 
      imagejpeg($img_copy,'pictures/'.$large,100);  
     } 
    } 
+0

嘿,謝謝大家的意見。沒有通過文件類型$ _FILES ['name'] ['type']修復它。 (對不起,我沒有提到$大變量是在我之前沒有發佈的腳本中定義的) – Ross 2009-10-23 18:19:33

回答

6
if($_FILES['image']['type'] == 'image/jpeg'){ 

切勿依賴瀏覽器提交的MIME類型。

在這種情況下,您的問題是大衛暗示:IE通常(錯誤地)爲JPEG提供image/pjpeg,所以您正在檢測未知的文件類型並將$ error設置爲Error: The image could not be uploaded. It must be in .jpg, .jpeg or .gif format. ...但儘管如此,您仍嘗試無論如何移動文件,儘管沒有設置$ small或$ large。

但更重要的是,瀏覽器提交的類型可能是完全錯誤的。你不能相信上傳的文件名或媒體類型是合適的,所以甚至不要去檢查它們。相反,在您調用getimagesize以查明PHP認爲圖像是什麼類型之後,請查看$imgsize[2]

而且,如果您接受來自一般用戶的圖片上傳,則會出現安全問題。完全可以創建包含HTML標籤的有效GIF(或其他文件類型)。然後,當血腥愚蠢的IE瀏覽器自動訪問GIF作爲一個頁面時,它會檢測到HTML標籤,決定您告訴它的內容類型是否是錯誤的,並將其解釋爲HTML頁面,包括任何那裏的JavaScript,然後在您的網站的安全上下文中執行。

如果您必須允許從不受信任的來源進行文件上傳,並且您沒有自己處理圖片(這通常會有刪除不需要的HTML的副作用),您通常必須從不同的主機名避免他們腳本進入您的網站。

+0

不知道你可以在圖像中嵌入HTML。人們會怎麼做?更重要的是,如何檢測上傳的圖像是否包含HTML標籤並據此進行處理? – akinuri 2016-08-11 04:27:27

+0

這是一個有趣的例子:http://lcamt​​uf.coredump.cx/squirrel/。試圖在任意文件中檢測標籤是一個相當註定的approuach,因爲你必須使用與瀏覽器相同的啓發式方法,這些瀏覽器是可變的和無證的。相反,如上所述,從不同的主機名提供您的用戶內容,以便如果它得到的XSS不能控制您的主站點。 – bobince 2016-08-12 20:36:19

+0

非常有趣。當我檢查圖像文件時,我可以看到HTML標籤。一些人建議從上傳的圖像中創建一個新圖像,以刪除文件和/或元數據中可能的HTML和腳本。這會起作用嗎?我正在考慮發佈一個關於我的特定情況的問題。 – akinuri 2016-08-12 22:29:12

0

不能移動目錄,因爲$大沒有價值,或被重置。

3
if($FILES['image']['type'] == 'image/jpeg'){ 

保存文件上傳數據的變量應爲$_FILES。由於$FILES是一個空的(剛剛使用的)變量,因此您的$large變量也是空的,因此您正在將文件移動到pictures/這是一個目錄,就像PHP告訴您的一樣。你的$error也應該包含錯誤消息,因爲它們之前都沒有if。

避免這種錯誤的一種方法是用error_reporting設置爲E_ALL開發,該應用程序會顯示一個通知,指出您的$FILES變量(錯字)未定義。

+0

無視這個答案,它看起來好像只是因爲錯誤格式化問題而造成了錯字這裏。我同意david.scheider的回答,在從IE上傳時檢查返回的MIME類型。 – Marko 2009-10-23 17:48:07