2011-04-21 70 views
0

我修改使用一些JavaScript基於此標記值屬性下載文件.aspx頁:C#安全性:檢查查詢字符串有效的.pdf文件名

<input type="hidden" id="launchDocument" value="pdf/<%=Settings.LaunchDocument%>" > 

該值是當前硬編碼到Web.config文件中。客戶希望這個頁面現在成爲他們存檔通訊的下載頁面。我的想法就是要在從查詢字符串的文件名的網頁拉那麼發送頁面可以定義正在被下載哪些文件:

<input type="hidden" id="launchDocument" value="../pdf/<%=Request.QueryString["filename"]%>" /> 

但是,我很擔心是否有任何安全風險,此方法。如果有,檢查查詢字符串的值的最佳做法是什麼,以確保它是一個有效的.pdf文件名,然後將其添加到頁面中?

在此先感謝您的幫助!

+2

什麼是阻止某人將查詢字符串設置爲「../../../../Windows/system32/config/SAM」並下載您的Windows密碼文件?不要將路徑/文件名暴露給世界。保留數據庫中的文件列表並暴露文件的數據庫ID值。 – 2011-04-21 13:14:56

回答

0

您可以創建一個HTTP處理程序來監視這些請求,並在處理程序檢查文件是否存在,如果它不重定向到一個適當的錯誤頁面...

+0

如果存在的文件是一個敏感文件,如Windows密碼文件(如@Marc B上面所示),則此檢查將通過。 – JLWarlow 2011-04-21 13:37:03

0
  1. 不要在<input>領域
  2. 使用的文件擴展名始終追加.PDF由輸入提供的路徑。
  3. 將相對路徑展開爲絕對路徑。
  4. 驗證的絕對路徑(檢查它在PDF下載目錄)
3

爲什麼實際文件名需要在那裏?創建一個表,將一個文件名與一個GUID關聯起來並傳遞給它。

當需要下載時,轉移到加載並吐出文件的腳本。

+0

或者,如果您不想傳遞GUID或類似的不透明標識符,請使用更簡單的方法。你甚至可以使用文件名。作爲獎勵,這會將存儲機制抽象出來,這意味着您可以移動文件並且用戶不會知道它,更不用說被它困擾了。 – 2011-04-21 13:43:48