2012-05-20 58 views
1

我有一個簡單的形式:服務器端圖片上傳驗證3 - 限制文件類型,大小和尺寸

@using (Html.BeginForm(null, null, FormMethod.Post, new { enctype="multipart/form-data" })) 
{ 
    <input type="file" name="image" /> 
    <br /> 
    <input type="submit" value="Upload" /> 
} 

這我張貼於:

[HttpPost] 
public ActionResult Upload(HttpPostedFileBase file) 
{ 
    if (file.ContentLength > 0) 
    { 
     // All necessary validation logic here 
    } 

    return RedirectToAction("Index"); 
} 

我想限制上傳的文件爲jpeg,png和gif格式。我無法限制上傳圖像的最小和最大寬度和高度以及圖像文件大小。

我想我可以通過簡單地改變if語句來檢查大小:

if (file.ContentLength > 0 && file.ContentLength < maxUploadSize) 

我知道如何檢查上傳文件的擴展名,但我寧願檢查它的MIME類型/頭,以及。

問題

鑑於上面的示例代碼中,我該如何正確驗證上傳的文件?我想,以確保該文件是:

  • 一個JPEG,GIF或PNG文件(檢查文件擴展名和文件頭)
  • 比最大上傳大小(文件大小)尺寸的
  • 沒有大在預先限定的範圍內(寬度/高度)
+0

的可能重複[如何驗證上傳的文件在ASP.NET MVC?(http://stackoverflow.com/questions/6388812/how-to-validate-uploaded-file-in-asp-net-mvc) –

回答

1

正如您所說,您應該通過文件擴展名驗證圖像類型。因爲請求標頭可能是僞造的,所以它不可靠。

爲了獲得最大上傳大小,您需要根據您的需要更新您的web.config或machine.config - 應用程序級別或機器級別。

爲IIS6:

<location path="upload"> 
    <system.web> 
    <httpRuntime maxRequestLength="xxx" /> 
    </system.web> 
</location> 

的IIS7: http://support.microsoft.com/kb/942074/

作爲驗證尺寸,必須在圖像中讀取並檢查其widthheight性能,這是構造函數bitmap class到在內存中執行。如果要先將圖像保存到文件中,請使用this one

細則打印: 增加此值可能會使您成爲拒絕服務(DOS)攻擊受害者,如here所述。

安全措施:

  • 一個工作,我周圍可以在這一刻想到的是安裝在另一臺服務器/計算機來處理文件上傳所以你的主要的Web服務器沒有采取命中。
  • 使用<location path="my-upload-path">將此設置應用於單個位置。
  • 考慮使用HttpHandler or HttpModule來處理上傳。

一旦我有比這更好的解決辦法,我會更新我的答案。

+2

我不會使用maxRequestLength來限制文件上傳的大小。餿主意。很大的副作用和不友善的錯誤。此外,文件擴展名可以比請求標題更容易改變。 –

+0

且不說<的httpRuntime的maxRequestLength =「XXX」 />不會增加IIS7 + – LukeP

+0

@Andrew理髮了極限,現在我知道的副作用(DOS或網絡brandwidth或其他),那麼,有沒有更好的辦法做到它? –

相關問題