ASP.NET限制上傳文件類(lèi)型的兩種方法
通常,為了防止因用戶上傳有害文件(如木馬、黑客程序)引發(fā)的安全性問(wèn)題,Web程序都會(huì)對(duì)用戶允許ASP.NET上傳文件類(lèi)型加以限制。而本文將要介紹的就是如何在ASP.NET應(yīng)用程序中利用Web Control的內(nèi)置屬性簡(jiǎn)單高效地實(shí)現(xiàn)ASP.NET限制上傳文件類(lèi)型的功能。
在調(diào)用PostFile對(duì)象的SaveAs方法保存上傳文件之前,可以通過(guò)PostFile對(duì)象的FileName屬性得到上傳的文件名。而有了上傳的文件名,就可以采用比對(duì)文件后綴名的方法知道上傳的文件是否屬于允許上傳的文件類(lèi)型。
根據(jù)這個(gè)思想,我們就得到了下面這段代碼:
- If Path.GetExtension(sFilePath) <> ".zip" Then
- Label2.Text = "本應(yīng)用程序只允許上傳zip格式的文件,請(qǐng)重新選擇!"
- Return
這時(shí)如果上傳后綴名不是zip的文件,就會(huì)發(fā)現(xiàn)文件無(wú)法上傳了。不過(guò),這并表示我們就不能把上傳其他格式的文件了。其實(shí),如果在上傳前,事先把文件后綴名改成zip,上面這段代碼就失去作用了。
之所以會(huì)出現(xiàn)這種情況,在于上面的判斷僅僅比對(duì)了文件名字符串,并沒(méi)有對(duì)文件格式做進(jìn)一步的分析。因此,如果要徹底達(dá)到ASP.NET限制上傳文件類(lèi)型,還需要用到PostFile對(duì)象的ContentType屬性。ContentType屬性的功能是獲取客戶端發(fā)送的文件的 MIME (注一)內(nèi)容類(lèi)型,由于瀏覽器在向服務(wù)器發(fā)送請(qǐng)求前,首先會(huì)確定發(fā)送內(nèi)容的MIME類(lèi)型,并將MIME類(lèi)型作為信息的一部分提交到服務(wù)器端,因此,有了MIME類(lèi)型信息(注二),就可以準(zhǔn)確知道上傳文件的實(shí)際類(lèi)型了。
If File1.PostedFile.ContentType <> "application/zip" Then
Label2.Text = "本應(yīng)用程序只允許上傳zip格式的文件,請(qǐng)重新選擇!"
這時(shí),如果再采用修改后綴名的方法上傳文件就會(huì)發(fā)現(xiàn)再也無(wú)法上傳了。
注一:MIME是一種技術(shù)規(guī)范,其中文翻譯為多用途Internet郵件擴(kuò)展(Multipurpose Internet Mail Extensions),主要用來(lái)在Internet傳輸過(guò)程中表示不同編碼格式的文件;
注二:要獲取不同文件格式的MIME定義,只要啟動(dòng)注冊(cè)表編輯器,然后在HKEY_CLASSES_ROOT下找到跟后綴名對(duì)應(yīng)的注冊(cè)表項(xiàng),如果存在文件格式的MIME定義,在右側(cè)窗口就會(huì)顯示一個(gè)名為“Content Type”的鍵,而這個(gè)鍵的值就是文件格式的MIME定義。
以上兩種方法混用,ASP.NET限制上傳文件類(lèi)型就基本實(shí)現(xiàn)了。但是如果某些有心人如果更改注冊(cè)表的 MIME 值的內(nèi)容一樣可以上傳惡意程序,如果這樣的話,只有加固程序和系統(tǒng),不讓其更改上傳后文件的擴(kuò)展名?;蚴遣捎米远x的控件,采用更嚴(yán)密的檢測(cè)措施。
【編輯推薦】