2010-08-20 127 views
5

我正在創建文件上傳腳本,我正在尋找驗證上傳文件的最佳技術和實踐。PHP上傳文件驗證

允許的擴展名是:

$allowed_extensions = array('gif','jpg','png','swf','doc','docx','pdf','zip','rar','rtf','psd'); 

下面是我在做什麼的清單。

  1. 檢查文件擴展名

    $path_info = pathinfo($filename); 
    if(!in_array($path_info['extension'], $allowed_extensions)) { 
        die('File #'.$i.': Incorrent file extension.'); 
    } 
    
  2. 檢查文件mime類型

    $allowed_mimes = array('image/jpeg','image/png','image/gif','text/richtext','multipart/x-zip','application/x-shockwave-flash','application/msword','application/pdf','application/x-rar-compressed','image/vnd.adobe.photoshop'); 
    if(!in_array(finfo_file($finfo, $file), $allowed_mimes)) { 
        die('File #'.$i.': Incorrent mime type.'); 
    } 
    
  3. 檢查文件的大小。

我該怎麼做才能確保上傳的文件是有效的文件?我注意到奇怪的事情。我將.jpg文件擴展名更改爲.zip,並將其上傳。我認爲它會有不正確的MIME類型,但之後我注意到我沒有檢查特定的類型,但是如果數組中存在特定的MIME類型。我會在稍後修復它,這對我來說沒有任何問題(當然,如果你有任何好的解決方案/想法,請不要猶豫分享它)。我知道如何處理圖像(嘗試調整大小,旋轉,裁剪等),但不知道如何驗證其他擴展。

現在是我的問題了。

  1. 你知道驗證這些文件的好技巧嗎?也許我應該解壓縮.zip/.rar文件的檔案,但文檔(doc,pdf)怎麼樣?
  2. 將旋轉,調整.psd文件的大小?
  3. 基本上我認爲.PSD文件有以下MIME類型:應用程序/八位字節流,但是當

我試着上傳文件.PSD這表明我(圖片/ vnd.adobe.photoshop)。我對此有點困惑。文件是否總是具有相同的MIME類型?

此外,我不能強制代碼塊工作。有人猜測爲什麼?

回答

3

大量的文件格式有一個漂亮的一套標準開始字節來表示的格式。如果您對前幾個字節進行二進制讀取,並根據已知格式的起始字節對其進行測試,則它應該是確保文件類型與擴展名匹配的相當可靠的方式。

例如,JPEG的起始字節是0xFF,0xD8;所以像這樣:

$fp = fopen("filename.jpg", "rb"); 
$startbytes = fread($fp, 8); 
$chunked = str_split($startbytes,1); 
if ($chunked[0] == 0xFF && $chunked[1] == 0xD8){ 
    $exts[] = "jpg"; 
    $exts[] = "jpeg"; 
} 

然後檢查對外。

可以工作。

+0

所以,糾正我,如果我錯了,如果JPEG的起始字節不同於'0xFF,0xD8;'這意味着文件是無效的權利?有沒有「起始字節」的列表?或...我如何創建它? – Tom 2010-08-20 22:27:58

+2

這裏有一個體面的列表:http://www.mikekunz.com/image_file_header.html雖然它缺少PNG,但是它的頭部與我所看到的非常一致。 – 2010-08-20 23:52:40

+0

@Collin艾倫:非常感謝!現在我知道要搜索什麼。 – Tom 2010-08-21 01:56:45

4

如果您想驗證圖像,好事做的是利用和getimagesize(),看看如果返回大小的一組有效的 - 或錯誤出如果一個無效的圖像文件。或者對於您嘗試支持的任何文件使用類似的功能。

的關鍵是,文件名是指絕對沒有。文件擴展名(.jpg等),MIME類型......都是針對人類的。

保證保證文件是正確類型的唯一方法是打開它並逐字節地評估它。也就是說,如果你想嘗試驗證大量的文件類型,顯然這是一項相當艱鉅的任務。在最簡單的層面上,您可以查看文件的前幾個字節,以確保它們與該類型文件的預期匹配。

+0

您是否知道分析第一個字節的手冊或文檔? – Tom 2010-08-20 22:26:49