2010-10-26 18 views
7

我想驗證文件類型以確保用戶正在上傳類型爲JPEG,GIF或PNG的圖像。因爲它檢查MIME內容類型,所以不用檢查文件擴展名,而是使用HttpPostedFile.ContentType更安全。HttpPostedFile.ContentType是驗證上傳文件的完美方式嗎?

protected void cvValidateImageType_ServerValidate(object source, ServerValidateEventArgs args) 
{ 
    if (fupImage.HasFile) 
    { 
     args.IsValid = (fupImage.PostedFile.ContentType.ToLower() == "image/jpg" || 
         fupImage.PostedFile.ContentType.ToLower() == "image/jpeg" || 
         fupImage.PostedFile.ContentType.ToLower() == "image/pjpeg" || 
         fupImage.PostedFile.ContentType.ToLower() == "image/gif" || 
         fupImage.PostedFile.ContentType.ToLower() == "image/x-png" || 
         fupImage.PostedFile.ContentType.ToLower() == "image/png"); 

    } 
    else 
     args.IsValid = true; 
} 

這是一個無瑕疵的方式來檢查文件類型,或可以被愚弄?

回答

6

使用擴展名可能更安全。 ContentType在來自客戶端的http請求中發送。如果您測試擴展名,用戶可以將exe的擴展名更改爲jpg,但它不會以exe的形式運行。

4

使用擴展名和HTTP標頭都是同樣不可靠的,因爲它們都可以輕易僞裝,無論是由惡意攻擊者使用原始HTTP請求,還是由無辜的瀏覽器用戶挑選錯誤命名的文件。如果你想確定,你必須打開文件並分析內容,沒有別的辦法。