2010-01-13 168 views
7

我有一個編輯器,可讓用戶添加存儲在數據庫中並呈現在網頁上的HTML。由於這是不可信的輸入,我打算使用Microsoft.Security.Application.AntiXsSS.GetSafeHtmlFragment來清理HTML。在存儲到數據庫之前或渲染之前對HTML進行消毒處理? (ASP.NET中的AntiXSS庫)

  • 我應該在保存到數據庫之前還是在將不可信輸入呈現到網頁之前進行santiize?
  • 在我的項目中包含AntiXSS源代碼而不是僅包含DLL是否有優勢? (也許我可以自定義白名單?)
  • 哪一類文件,我應該去找實際執行的GetSafeHtmlFragment

回答

28

我所選擇的答案不同意,原因有二

  1. 如果存儲編碼數據,您必須在存儲之前,選擇一個編碼器。如果您將某些內容存儲爲HTML,但又想以其他格式將其推出(例如作爲JSON響應或作爲XML文檔的一部分),會發生什麼情況?您現在有一個必須解碼的HTML編碼格式,然後以正確的格式進行編碼。
  2. 如果我們發現編碼器中的錯誤並推出新版本,該怎麼辦?現在,因爲您沒有在輸出點進行編碼,所有舊數據可能包含錯誤編碼的內容。你可以重新編碼,但是當你遇到雙重編碼問題時,可能會很痛苦地正確過濾。

通常,您在輸出點進行編碼,並將來自數據存儲區的任何數據默認爲不可信 - 畢竟,如果有人設法直接編輯數據庫或通過SQL注入來做什麼呢?

+1

我回來並投票支持你因爲我同意你的論點,你的建議與OWASP的建議相符。希望@ user102533會切換並接受你的。 – David 2010-02-26 17:51:05

+1

他沒有存儲編碼數據,他存儲的是消毒數據 - 差別很大(它仍然是未編碼的HTML) – orip 2010-05-05 12:59:08

+0

點2仍然存在(是的,我在閱讀中沒有給予足夠的關注!)如果在消毒劑中存在錯誤怎麼辦?或者你想改變sanitzation規則? – blowdart 2010-05-05 16:28:41

3
  • 兩個
  • 只有當你打算改變它,我不會不親自
  • 的AntiXss類(因爲它被稱爲AntiXss.GetSafeHtmlFragment()
+0

數據庫中已經有HTML代碼,如果我在將它添加到數據庫之前進行清理,那麼我需要清理已存在的數據(爲了一致性)。但是在將其添加到數據庫中之前是否有任何消毒價值? – Nick 2010-01-14 03:24:01

+0

對我來說,主要的價值在於它可能是一個新手,他會讓下一個Web應用程序從您的數據庫中讀取數據。你永遠不知道在你開始轉向綠色牧場之後誰會接管。另外,養成這樣做的習慣是很好的,所以它是第二性質的。 – David 2010-01-14 03:37:54

+0

+1每次消毒,以防萬一。唯一需要注意的是性能可能受到影響,在這種情況下,您可以在保存到數據庫時進行清理,但您需要小心數據庫中的所有信息都已經過清理。 – orip 2010-05-05 13:01:38

-1

您可以在頁面指令參數使用ValidateRequest =「true」。通過這種方式,所有的請求數據都經過驗證,如果存在驗證問題,您可以隨時發現錯誤。它還可以防止SQL注入線程和其他不僅可能的XSS。

數值數據,你可以驗證整數溢出或Int32.TryParse()或任何其他的TryParse家庭(Byte.TryParse Int16.TryParse ...)的數據類型的濫用

無需使用任何其他類別或額外的消毒劑方法。

+0

默認情況下,請求驗證處於啓用狀態,但您對此有太多的信任。您需要將它作爲一層安全性,並在輸入點(您對此進行了解釋)和輸出編碼時進行白名單驗證。對於SQL注入來說,它也不會有太大的幫助。 「'或1 = 1」的陳述將直接通過。這可能有助於你更好地解釋它:http://www.troyhunt.com/2010/05/owasp-top-10-for-net-developers-part-2.html – 2010-05-25 21:24:32

8

聽一聽OWASP podcast 67 with Jeff Williams on XSS。他在存儲之前談論的不是消毒或編碼。主要原因是,如果(當)圖書館爲響應新漏洞而進化時,您的數據將在舊版本中停滯不前。當然,這不會阻止您在入口點對白名單進行任何輸入,並拒絕超出可接受範圍的任何內容。

相關問題