2010-06-17 237 views
3

我發現這個片段只會允許某些文件類型。它會工作嗎?有人可以繞過它來上傳他們想要的任何文件類型嗎?有人可以解釋substr部分,我不知道它是如何工作的。這隻會允許某些擴展嗎?

<?php 
function CheckExt($filename, $ext) { 
    $name = strtolower($filename); 
    if(substr($name, strlen($name) -3, 3) == $ext) 
     return true; 
    else 
     return false; 
} 
?> 
+2

這將是一個簡寫該函數:'返回substr(strtolower($文件名),-3)== $ ext;' – 2010-06-17 23:17:07

回答

7

一種更好的方式來檢查擴展

function checkExt($filename, $ext) 
{ 
    $fnExt = strtolower(pathinfo($filename, PATHINFO_EXTENSION)); 
    if(!is_array($ext)) { 
    $ext = (array)$ext; 
    } 
    $ext = array_map('strtolower', $ext); 
    return in_array($fnExt, $ext); 
} 

然後,您可以使用SUBSTR作爲擴展長度未知稱呼它

var_dump(checkExt('test.temp', 'tmp')); // false 
var_dump(checkExt('test.temp', array('tmp', 'temp'))); // true 

避免(你可以使用substr當作& strrpos很好,但PHP爲您提供此功能)

0

人們仍然可以上傳任何他們想要的東西;他們只需要給文件一個特定的擴展名。對於substr,請參閱manual

5

這是很容易繞過,因爲改變文件的擴展名不會改變文件的內容。所以.exe改名爲.jpg仍然是.exe無論如何等待運行。您可以將其用於基本檢查,但不要單靠它來驗證文件類型。

substr()電話:

substr($name, strlen($name) -3, 3) 

更好更簡單地寫爲:

substr($name, -3) 

的PHP只是解釋爲「只拿最後3級$name人物。

編輯:這不是更好本身,因爲文件擴展名不一定是3個字符長。他們可能是2,他們可能是4,5甚至10.這就是爲什麼我說,檢查文件擴展名是不是很可靠。

+0

好的謝謝,但我的意思是我不希望人們上傳貝殼,如果他們改變它的圖像擴展名,它會無法執行的PHP,或者他們可以嗎? – 2010-06-17 23:30:34

+1

@Dr Hydralisk當允許任何用戶上傳文件時,您應該將這些文件的權限設置爲不可執行! – 2010-06-17 23:32:04

+0

@Dr Hydralisk:他們可能無法做到,但我認爲最好是安全的。沒有任何一點保留惡意文件。 – BoltClock 2010-06-17 23:33:37

1

我更喜歡白名單我想要的Mimetypes使用流沿着我用這個有黑名單後綴如「PHP」的

$mimesGeneral = array(
     'txt'=>'text/plain', 
     'doc'=>'application/msword', 
     'pdf'=>'application/pdf', 
     'xls'=>'application/x-excel', 
     'xls'=>'application/excel', 
     'xls'=>'application/vnd.ms-excel', 
     'rtf'=>'application/rtf', 
     'zip'=>'application/zip' 

     ); 
$success = false; 
foreach($allowedMimes as $key=>$value){ 

      if($_FILES['uploaded_file']['type'] == $value){ 

       return true; 
      } 
     } 

線的東西,「PL」,「EXE」等等......

+0

mimetypes也可以是僞造的以及擴展名。 – 2010-06-18 08:16:59

+0

不知道 - >除了將數據附加到圖像上,這就是爲什麼我總是通過GD運行用戶輸入並創建新圖像而不是使用原始圖像的原因。 我想這是另一個領域,然後查看任何允許用戶上傳的東西。 – niggles 2010-06-21 05:46:06