2010年1月17日星期日

網頁設計[ASP.NET] 限制上傳文件類型的兩種方法

網頁設計[ASP.NET] 限制上傳文件類型的兩種方法

發佈者:作者:Web Design香港網頁設計大皇 - 網站設計
Web Design
  通常,為了防止因用戶上傳有害文件(如木馬、黑客程序)引發的安全性問題,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 值的內容一樣可以上傳惡意程序,如果這樣的話,只有加固程序和系統,不讓其更改上傳後文件的擴展名。或是採用自定義的控件,採用更嚴密的檢測措施Web Hosting

没有评论:

发表评论