2010-01-20 53 views
1

我在這裏做什麼有什麼問題嗎?這是我第一次處理這樣的事情,我只是想確保我理解所有風險等不同的方法。白名單,防止在C#中使用WMD控制XSS

我正在使用WMD獲取用戶輸入,並且我用文字控件顯示它。 因爲它是不可編輯輸入一次,我將存儲HTML而不是降價,

input = Server.HTMLEncode(stringThatComesFromWMDTextArea) 

然後運行類似的標籤我希望用戶能夠使用以下。

// Unescape whitelisted tags. 
string output = input.Replace("&lt;b&gt;", "<b>").Replace("&lt;/b&gt;", "</b>") 
        .Replace("&lt;i&gt;", "<i>").Replace("&lt;/i&gt;", "</i>"); 

編輯下面是我在做什麼目前:

public static string EncodeAndWhitelist(string html) 
{ 
    string[] whiteList = { "b", "i", "strong", "img", "ul", "li" }; 
    string encodedHTML = HttpUtility.HtmlEncode(html); 
    foreach (string wl in whiteList) 
     encodedHTML = encodedHTML.Replace("&lt;" + wl + "&gt;", "<" + wl + ">").Replace("&lt;/" + wl + "&gt;", "</" + wl + ">"); 
    return encodedHTML; 
} 
  1. 請問我在這裏做讓我免受XSS什麼?
  2. 有沒有其他的考慮 應該做?
  3. 是否有正常的 標籤到白名單的好名單?
+0

該代碼將不適用於「IMG」標籤,因爲替換「<img>」不允許「src」屬性「 – David 2010-01-20 20:23:56

回答

2

如果你的要求真的是基本的,你可以做這麼簡單的字符串替換,那麼是的,這對XSS是「安全的」。 (但是,它仍然可以提交非形成井的內容,其中<i><b>是錯誤的嵌套或不封閉,這可能會搞亂了內容最終頁插入。)

但這是很少就夠了。例如當前不允許使用<a href="..."><img src="..." />。如果你想允許這些或其他具有屬性值的標記,你可以做更多的工作。然後你可以用正則表達式來處理它,但是這會給你帶來無盡的問題,意外的嵌套和替換已經被替換的內容,看看正則表達式如何解析HTML,以及那個。

爲了解決這兩個問題,通常的方法是在輸入上使用[X] [HT] ML分析器,然後遍歷DOM去除所有已知好的元素和屬性,最後重新串行爲[X ] HTML。結果保證格式正確並且只包含安全內容。

+0

因此,假設我想要更強大的東西,您會爲你提到的解析器?HTML敏捷包可以處理它嗎? 是不是有所有這一切已經完成? – Jason 2010-01-20 20:36:27

+0

是的,HTML敏捷包是一個不錯的選擇。一旦你解析了DOM,這是一個相對簡單的練習,寫一個遞歸函數可以從DOM樹中刪除所有已知好的元素/屬性,並且如果你允許'href' /'src'/etc,記得檢查已知好的方案的URL,例如'http' /'https' ,以避免通過'javascript:'URL注入等。 – bobince 2010-01-20 20:58:14