2009-12-31 60 views
2

我們有一個ASP.NET自定義控件,允許用戶輸入HTML(類似於Rich文本框)。我們注意到用戶可能會在HTML視圖中的<script>標記內注入惡意客戶端腳本。我可以在保存時驗證HTML代碼,以確保刪除任何<script>元素。防止以HTML格式保存惡意客戶端腳本的最佳做法

這是我需要做的嗎? <script>標籤以外的所有其他標籤是否安全?如果你是攻擊者,你還會嘗試做什麼?

我需要遵循的任何最佳實踐?

編輯 - 爲我的目的,MS Anti Xss庫與本地HtmlEncode不同?

回答

6

XSS(跨站腳本)是一個很難解決的難題。

取代黑名單中的某些標籤(並且缺少一些可能會受到攻擊的方式),最好確定一組適用於您的網站且只允許它們的標籤。

這本身還不夠,因爲您必須抓住攻擊者可能嘗試的所有可能的編碼,並且攻擊者可能會嘗試其他方法。有一些反xss庫可以幫助 - here是微軟提供的。

欲瞭解更多信息和指導,請參閱this OWASP文章。

+1

絕對使用一個實現瞭解析+白名單方法的現有庫!除了僅允許列入白名單的標籤和屬性之外,您還需要確保該庫在不同瀏覽器的HTML解析中處理怪癖!例如,退格字符可能會導致解析器跳過一些HTML而不是標籤,但瀏覽器可能會將其解釋爲'

0

僅刪除<script>標記將不足以滿足輸入中編碼/隱藏它們的許多方法。大多數語言現在都具有用於過濾輸入的反xss和反csrf庫和函數。您應該使用這些通用商定的庫之一來過濾用戶輸入。

我不知道什麼是最好的選擇是在ASP.NET,但是這可能會提供一些線索: http://msdn.microsoft.com/en-us/library/ms998274.aspx

0

這叫做Cross Site Scripting (XSS) attack。他們可能很難預防,因爲執行JavaScript代碼有很多令人驚訝的方法(javascript: URL,有時CSS,objectiframe標籤等)。

最好的方法是將網址的標籤,屬性和類型列入白名單(並儘可能小地保留白名單以滿足您的需求)而不是列入黑名單。這意味着你只允許某些你知道安全的標籤,而不是禁止你認爲有危險的標籤。通過這種方式,人們可以以更少的方式攻擊您的系統,因爲您沒有考慮過的標記將不被允許,而不是被列入黑名單,如果您錯過了某些內容,您仍然存在漏洞。 Here's an example清潔白名單的方法。

+0

是否有示例我可以使用的白名單標籤和屬性? – Nick 2009-12-31 20:15:21

+0

你看過我鏈接的例子嗎?它有一個可列入白名單的標籤和屬性示例列表。 – 2010-01-03 17:41:20

2

從HTML中濾除JavaScript時有很多事要做。以下是一些較大分數的簡短列表:

  • 需要多次遍歷輸入以確保您之前刪除的內容不會創建新的注入。如果您只做一次傳球,那麼<scr<script></script>ipt>alert("XSS!");</scr<script></script>ipt>之類的內容會從您的字符串中移除<script>標記後過時,因此您將創建一個新的標記。
  • 剝去使用javascript:協議的hrefsrc屬性。
  • 剝離嵌入的事件處理程序屬性,如onmouseover/out,onclick,0 onkeypress
  • 白名單比黑名單安全。只允許你知道的標籤和屬性是安全的。
  • 確保你處理的是全部相同的字符編碼。如果您將輸入視爲ASCII(單字節)並且輸入具有Unicode(多字節)字符,那麼您會遇到令人不愉快的驚喜。

這是一個更完整的cheat sheet。此外,Oli鏈接到一個很好的文章ha.ckers.org與樣品來測試你的過濾。