通常,為了防止因使用者上傳有害檔案(如木馬、駭客程式)引發的安全性問題,Web程式都會對使用者允許上傳的檔案類型加以限制。而本文將要介紹的就是如何在ASP.NET應用程式中利用Web Control的內建屬性簡單高效地實現限制上傳檔案類型的功能。
在調用PostFile對象的SaveAs方法儲存上傳檔案之前,可以通過PostFile對象的FileName屬性得到上傳的檔案名稱。而有了上傳的檔案名稱,就可以採用比對檔案尾碼名的方法知道上傳的檔案是否屬於允許上傳的檔案類型。
根據這個思想,我們就得到了下面這段代碼:
If Path.GetExtension(sFilePath) <> ".zip" Then
Label2.Text = "本應用程式只允許上傳zip格式的檔案,請重新選擇!"
Return
這時如果上傳尾碼名不是zip的檔案,就會發現檔案無法上傳了。不過,這並表示我們就不能把上傳其他格式的檔案了。其實,如果在上傳前,事先把檔案尾碼名改成zip,上面這段代碼就失去作用了。
之所以會出現這種情況,在於上面的判斷僅僅比對了檔案名稱字串,並沒有對檔案格式做進一步的分析。因此,如果要徹底限制上傳的檔案類型,還需要用到PostFile對象的ContentType屬性。ContentType屬性的功能是擷取用戶端發送的檔案的 MIME (注一)內容類型,由於瀏覽器在向伺服器發送請求前,首先會確定發送內容的MIME類型,並將MIME類型作為資訊的一部分提交到伺服器端,因此,有了MIME類型資訊(注二),就可以準確知道上傳檔案的實際類型了。
If File1.PostedFile.ContentType <> "application/zip" Then
Label2.Text = "本應用程式只允許上傳zip格式的檔案,請重新選擇!"
這時,如果再採用修改尾碼名的方法上傳檔案就會發現再也無法上傳了。
注一:MIME是一種技術規範,其中文翻譯為多用途Internet郵件擴充(Multipurpose Internet Mail Extensions),主要用來在Internet傳輸過程中表示不同編碼格式的檔案;
注二:要擷取不同檔案格式的MIME定義,只要啟動登錄編輯程式,然後在HKEY_CLASSES_ROOT下找到跟尾碼名對應的登錄機碼,如果存在檔案格式的MIME定義,在右側視窗就會顯示一個名為“Content Type”的鍵,而這個鍵的值就是檔案格式的MIME定義。
以上兩種方法混用,上傳檔案基本上就被限制了。但是如果某些有心人如果更改註冊表的 MIME 值的內容一樣可以上傳惡意程式,如果這樣的話,只有加固程式和系統,不讓其更改上傳後檔案的副檔名。或是採用自訂的控制項,採用更嚴密的檢測措施