2017-10-17 146 views
15

我創建一個ASP.Net窗體與文件上傳控件,然後將電子郵件的形式和文件的詳細信息到另一個管理員。我想確保這個安全(對於服務器和收件人)。附件應該是簡歷,因此我將其限制爲典型的文本文檔。使ASP.Net文件上傳安全

從我能告訴我們最好的選擇是檢查文件擴展名或MIME類型是否屬於這種類型,並根據「幻數」檢查它以驗證擴展沒有被更改。我並不太在意如何去做這件事,但想知道這是否足夠。

我也很樂意使用第三方產品,注意到了這一問題,我已經看了一對夫婦:

blueimp jQuery的文件上傳 http://blueimp.github.io/jQuery-File-Upload/

和cutesoft ajaxuploader http://ajaxuploader.com/Demo/

但blueimp似乎仍然需要自定義服務器驗證(我猜只是jQuery它只是處理客戶端驗證)和.net之一檢查MIME類型匹配的擴展,但我認爲MIME類型遵循擴展無論如何。

所以,

我是否需要擔心服務器的安全性,當文件被作爲附件添加,但沒有保存? 是否有一個插件或控件來處理這個問題? 如果我需要實現某些服務器驗證,我自己是否將MIME類型與「幻數」匹配得足夠好?

我確定沒有任何東西是100%防彈的,但文件上傳是非常常見的東西,我假設大多數實現是「足夠安全」 - 但是怎麼做?

如果是相關的,這裏是我的基本代碼到目前爲止

<p>Please attach your CV here</p> 
<asp:FileUpload ID="fileUploader" runat="server" /> 

並提交

MailMessage message = new MailMessage(); 
if (fileUploader.HasFile) 
{ 
    try 
    { 
     if (fileUploader.PostedFile.ContentType == "text") 
     { 
      // check magic numbers indicate same content type... if(){} 

      if (fileUploader.PostedFile.ContentLength < 102400) 
      { 
       string fileName = System.IO.Path.GetFileName(fileUploader.PostedFile.FileName); 
       message.Attachments.Add(new Attachment(fileUploader.PostedFile.InputStream, fileName)); 
      } 
      else 
      { 
       // show a message saying the file is too large 
      } 
     } 
     else 
     { 
      // show a message saying the file is not a text based document 
     } 
    } 
    catch (Exception ex) 
    { 
     // display ex.Message; 
    } 
} 
+0

_「當文件作爲附件添加但未保存時,我是否需要擔心服務器安全?」不確定你的意思?什麼是「保存」?對於過程的哪一部分「安全」?如果條件不滿足,你是否試圖從'''.files'屬性中移除文件對象? – guest271314

+0

@ guest271314用戶正在上傳文件,並將其作爲附件添加到隨後發送的電子郵件中。據我所知這不會導致文件被保存在服務器上,我猜它最終會在郵件服務器上。收件人可能會保存它,但我的意思是它沒有保存在服務器上。 – wunth

+0

_「收件人可能會保存它,但我的意思是它沒有保存在服務器上。」_您對所描述的過程有什麼擔憂? – guest271314

回答

3

的服務器可以永遠是100%安全的,但我們應該盡最大努力減少事故風險。在這一點上我應該說我不是專家,我只是一名計算機科學專業的學生。所以,在這種情況下,我會採用一種方法。請評論您可以提供的任何額外提示。


一般來說,爲了有一個安全的形式,所有的客戶端輸入必須檢查和驗證。任何來自我們系統的信息都不可信。從我們的情況下,客戶

輸入:

  • 文件的名稱
    • 擴展
  • 文件的內容

分機

我們並不真正關心minetype,這是一個Web服務器的信息。我們關心文件擴展名,因爲這是操作系統關於如何運行/讀取/打開文件的指示器。我們必須只支持特定的文件擴展名(你的管理員的電腦可以處理的),沒有支持未知文件類型的點。

名稱(不包括擴展名)

文件的名稱並不總是有價值的信息。當我處理文件上傳時,我通常將其重命名爲(設置)一個id(用戶名,時間戳,哈希等)。如果名字很重要,如果你只希望字母或數字刪除所有其他字符(我避免留下「/」,「\」,「。」,因爲它們可以用於注入路徑),請檢查/修剪它。

所以現在我們假設生成的文件名是安全的。

內容

當你上不支持結構化的文件,你就無法驗證該文件的內容。因此,讓一個專家程序爲您做這個......用防病毒掃描它們。從控制檯調用防病毒軟件(小心使用避免注入的機制)。許多殺毒軟件也可以掃描壓縮文件內容(惡意文件,在服務器上的文件夾中不是個好主意)。始終保持掃描程序更新。


關於我建議壓縮文件的評論,以避免在管理員的機器和服務器上自動執行。管理員的機器防病毒可以在解壓縮之前處理它。

還有一些小竅門,不要給客戶提供比他需要的更多信息......不要讓客戶知道文件保存在哪裏,不要讓網絡服務器訪問它們以便分發無需。保持日誌與奇怪的行動(斜槓在文件名,太大的文件,太長的名稱,像「sh」「EXE」「蝙蝠」)警告擴展),並報告管理員的電子郵件,如果有什麼奇怪的事情發生(很好知道你的保護工作)。

所有這些都會創建服務器工作負載(更多的系統漏洞),因此您應該計算在接受新的文件上載請求之前掃描/檢查的文件數(這是我要發起DDoS攻擊的位置)。

快速谷歌搜索Avast! For Linux - Command Line Guide,我不宣傳Avast,我只是把它作爲一個現有的例子。

最後但並非最不重要的一點,你不是偏執狂,我管理一個自定義翻譯系統,我編碼...垃圾郵件和黑客攻擊已經發生了不止一次。


還有一些想法,運行在網頁上的JavaScript只對客戶端計算機安全(這要歸功於瀏覽器的安全性)。我們可以使用它來防止向服務器發送無效帖子,但這並不能確保這樣的請求不會被完成,因爲JavaScript可以被繞過/編輯。因此,所有的JavaScript解決方案僅用於第一次驗證(通常只是爲了幫助用戶更正錯誤)並正確設置表單數據。