2013-03-20 37 views
2

在我正在處理的文件上傳功能中,一個重要的問題是讓我可以保存上傳的圖像用戶的路徑。在下面的代碼中,我已經在基於web的應用程序文件夾中指定了用於保存上傳文件的文件夾。我的教練告訴我,在asp.net UploadFile控件的代碼隱藏中,我仍然有一個安全漏洞,並且我不知道爲什麼!如何避免文件上傳功能中的路徑或目錄操作?

string path = @"~\Images\"; 
string comPath = Server.MapPath(path + "\\" + FileUpload1.FileName); 

你能告訴我如何防止這種安全漏洞?

UPDATE:

誰能告訴我如何避免這種安全漏洞?我仍然在努力尋找使這兩條線路安全的東西。

+0

你可以做的一件事就是使用Path.Combine。 (雖然這與您的安全漏洞問題無關,但它是一種很好的做法) – Yahya 2013-03-20 12:19:55

回答

1

我的導師告訴我,在asp.net UploadFile控件的代碼隱藏中,我仍然有一個安全漏洞,並且我不知道爲什麼!

想象一下,如果客戶端發送像..\..\foo.jpg這樣的文件名稱會發生​​什麼情況。

+0

感謝您澄清原因。那麼我怎樣才能防止這個漏洞呢?例如, – 2013-03-20 12:46:32

+0

+1。 – 2013-03-20 12:46:55

+0

那麼,如果'Server.MapPath'解析了像'〜\ Images \ .. \ foo \ image.jpg'這樣的路徑到'〜\ foo \ image.jpg',你可以檢查結果路徑的前綴是否仍然是' 〜\ Images \' - 如果不拒絕它。或者如果客戶端發送完整路徑,則只提取文件名。您不應該相信來自客戶端的文件名 - 它可能包含其他在文件系統中證明有問題的字符f.e.一個'?'或'*'。如果沒有必要,你不應該使用客戶端發送的文件名,而是自己編寫(隨機,uniqid,...)並保存新的「翻譯」爲原始文件名。 – CBroe 2013-03-20 12:52:01

0

一個相當簡單的修復方法是確保文件名中沒有\/個字符,通過刪除所有的東西直到第一個這樣的字符。 (這是一個好主意無論如何,因爲瀏覽器在其治療的上傳文件名各不相同:有些會send the full path,一些just the plain file name有些甚至send a fake path instead。)

最簡單的方式做,這是一個正則表達式:

string fileName = Regex.Replace(FileUpload1.FileName, @"(?s)^.*[\\/]", ""); 

請注意,根據您的操作系統和文件系統,還有其他可能導致問題的字符。最安全的選擇,在一般情況下,是剝去所有人物,除了那些你知道是安全的,是這樣的:

string safeFileName = Regex.Replace(fileName, @"[^A-Za-z0-9\-._() ]", ""); 

您可能還需要進一步確保文件名中有擴展匹配您期望文件的類型。

相關問題