2009-02-06 17 views
9

我正在構建一個允許用戶上傳文件的門戶。我需要確保這些文件不包含病毒。我的理想解決方案是讓主機操作系統AV監視臨時文件夾並掃描所有傳入文件。ASP.Net 2中的上傳文件在哪裏?

當一個文件上傳到ASP.Net 2中時,它是否寫入臨時文件夾中的磁盤,或者它是否保存在內存中?如果將它寫入磁盤,IIS會將其鎖定,以使AV無法刪除它?如果它被寫入磁盤,在哪裏?

+0

非常有趣的問題,必須說! +1 – Cerebrus 2009-02-06 10:27:48

回答

8

我認爲最理想的方法是擁有一個「傳入」文件夾,該文件夾已被賦予ASP.NET保存文件所需的權限。即使您在FileUpload控件上調用SaveAs後,我也從未遇到過文件保持鎖定的情況。

請注意,直到調用SaveAs時,FileUpload控件纔會上載文件,這是在服務器上將文件保存到磁盤時的情況。它似乎將所有文件內容保存在HttpInputStream中,當調用SaveAs方法時,該文件寫入磁盤。

然後,您的AV應用程序可以免費掃描該文件。如果發生錯誤,您可以向用戶提供相關反饋。

3

您是否使用ASP FileUpload服務器控件?

如果是這樣,它會被加載到服務器的內存中,直到你做了一些事情。

這是來自MSDN;

在保存上傳文件的位置沒有固有限制。但是,要保存該文件,ASP.NET進程必須具有在您指定的位置創建文件的權限。另外,您的應用程序可能被配置爲需要一個絕對路徑(而不是相對路徑)來保存文件,這是一種安全措施。

0

就像Cerebrus我會告訴你,UploadFile控件將寫任何東西到磁盤驅動器,除非你告訴它。

1

如果您對安全性非常重視,另一個相關提示是確保您將文件保存到的文件夾位於webroot上方,以便用戶無法以任何方式直接訪問它。您仍然可以讓他們有能力刪除他們上傳的文件與一些數據庫工作,即保存位置,並確保每個文件都是唯一命名的(如果用戶正在進行身份驗證我只保存文件名爲USERNAME.XYZ其中XYZ是文件的擴展名

9

這是ASP.NET如何處理文件的實際問題,它依賴於版本,但是在所有後續版本中,在你有機會處理它們之前,上載到磁盤上面的答案實際上是錯誤的 - ASP .NET 2.0以上版本寫入磁盤如果你仔細想想,將上傳加載到內存中會打開你的DDOS洞,因爲大文件會佔用越來越多的服務器內存。行爲:

  • 在您可以訪問它之前,ASP.NET 1.0和1.1將整個請求加載到內存中。這意味着大文件可能會填滿所有內存,導致異常並導致服務器關閉。

  • ASP.NET 2。0引入了用於上傳的磁盤緩存方案,並在客戶端代碼可以處理之前再次上傳並處理它。臨時文件夾的訪問方式如下:

    string uploadFolder = Path.Combine(HttpRuntime.CodegenDirInternal,「uploads」);

  • 作爲ASP.NET 4.0的,上面提到的屬性名稱是HttpRuntime.CodegenDir:

    串uploadFolder = Path.Combine(HttpRuntime.CodegenDir, 「上傳」);

至少現在它被緩存到磁盤,所以你沒有1.0和1.1的內存問題,但是直到它被完全檢索後才能訪問它。

+0

+1,它也出現`HttpRuntime.CodegenDir`是System.Web.dll 4.0.30319中的正確的基本路徑,而不是`HttpRuntime.CodegenDirInternal` – meklarian 2013-02-13 23:51:10

1

對於你的場景......我通常有一個appsetting的任何上傳/臨時位置,在〜/ App_Data/Uploads下有一個默認值,直到字節持久化到磁盤後,它才應該對AV可見。如果你真的想主動掃描,那麼你可能希望有一個多級隊列......(同樣,你會想在ASP.Net中做一個異步請求),如果你等待任何掃描完成。

  • 你推的項目到一個隊列來檢查說30秒(有足夠的時間AV掃描儀)
  • 您將文件保存到上傳目錄(被選中)
  • 您有其他服務檢查隊列,並將其標記爲已完成/已處理(如果它仍然存在於30秒內)
  • 您的用戶界面將每隔10秒檢查一次隊列以查看是否完成,然後將其呈現給用戶。

我會考慮用您的本機掃描程序列出您的上傳路徑,並查看是否有暴露的API可以按要求運行手動掃描。另一種方法是使用ClamAV/ClamWin安裝程序作爲服務掃描程序,您可以每小時運行一次更新(我已經爲郵件系統執行了此操作),並且對於文件簽名,即使在存檔文件中它也相當不錯如果配置正確)。

此外,您可能希望使用7z.exe(7-zip命令行)來提取任何檔案。 7-zip可以提取幾乎所有我見過的檔案類型,即使它只支持新檔案的幾個壓縮目標。

希望這會有所幫助,因爲我打算將此作爲對其他帖子的評論追加,但時間越來越長。