2010-06-10 68 views
4

我一直在發現,對於我認爲很重要的東西,很少有關於如何處理這個問題的信息或庫。這可以改善嗎?清理危險的html標籤

我在搜索時發現了這個。我真的不知道黑客可以嘗試插入危險標籤的所有萬種方法。

我有一個豐富的HTML編輯器,所以我需要保持非危險標籤,但剝去壞的標籤。

那麼這個腳本是否缺少任何東西?

它使用html敏捷包。

public string ScrubHTML(string html) 
{ 
    HtmlDocument doc = new HtmlDocument(); 
    doc.LoadHtml(html); 

    //Remove potentially harmful elements 
    HtmlNodeCollection nc = doc.DocumentNode.SelectNodes("//script|//link|//iframe|//frameset|//frame|//applet|//object|//embed"); 
    if (nc != null) 
    { 
     foreach (HtmlNode node in nc) 
     { 
      node.ParentNode.RemoveChild(node, false); 

     } 
    } 

    //remove hrefs to java/j/vbscript URLs 
    nc = doc.DocumentNode.SelectNodes("//a[starts-with(translate(@href, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'javascript')]|//a[starts-with(translate(@href, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'jscript')]|//a[starts-with(translate(@href, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'vbscript')]"); 
    if (nc != null) 
    { 

     foreach (HtmlNode node in nc) 
     { 
      node.SetAttributeValue("href", "#"); 
     } 
    } 


    //remove img with refs to java/j/vbscript URLs 
    nc = doc.DocumentNode.SelectNodes("//img[starts-with(translate(@src, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'javascript')]|//img[starts-with(translate(@src, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'jscript')]|//img[starts-with(translate(@src, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'vbscript')]"); 
    if (nc != null) 
    { 
     foreach (HtmlNode node in nc) 
     { 
      node.SetAttributeValue("src", "#"); 
     } 
    } 

    //remove on<Event> handlers from all tags 
    nc = doc.DocumentNode.SelectNodes("//*[@onclick or @onmouseover or @onfocus or @onblur or @onmouseout or @ondoubleclick or @onload or @onunload]"); 
    if (nc != null) 
    { 
     foreach (HtmlNode node in nc) 
     { 
      node.Attributes.Remove("onFocus"); 
      node.Attributes.Remove("onBlur"); 
      node.Attributes.Remove("onClick"); 
      node.Attributes.Remove("onMouseOver"); 
      node.Attributes.Remove("onMouseOut"); 
      node.Attributes.Remove("onDoubleClick"); 
      node.Attributes.Remove("onLoad"); 
      node.Attributes.Remove("onUnload"); 
     } 
    } 

    // remove any style attributes that contain the word expression (IE evaluates this as script) 
    nc = doc.DocumentNode.SelectNodes("//*[contains(translate(@style, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'expression')]"); 
    if (nc != null) 
    { 
     foreach (HtmlNode node in nc) 
     { 
      node.Attributes.Remove("stYle"); 
     } 
    } 

    return doc.DocumentNode.WriteTo(); 
} 

編輯

2人建議白名單。我真的很喜歡白名單的想法,但從來沒有真正做到這一點,因爲沒有人能真正告訴我如何在C#中做到這一點,我甚至無法真正找到如何在C#中完成的教程(我最後一次看。再次檢查出來)。

  1. 你如何製作白名單?它只是一個列表集合?

  2. 你如何實際解析出所有的html標籤,腳本標籤和其他標籤?

  3. 一旦你有標籤,你如何確定哪些是允許的?將它們與您的收藏列表進行比較但是,如果內容進入並具有100個標籤並且您有50個標籤,會發生什麼情況。你必須將50個標籤中的每一個與50個允許的標籤進行比較。這有點過了,可能會很慢。

  4. 一旦發現無效標籤,您如何刪除它?如果發現一個標籤無效,我並不想拒絕整套文本。我寧願刪除並插入其餘的。

  5. 我應該使用html敏捷包嗎?

回答

3

是的,我已經看到你錯過onmousedown事件,onmouseup,平變化,的onsubmit等,這就是爲什麼要使用白名單兩種標記和屬性的一部分。即使你現在有一個完美的黑名單(非常不可能),標籤和屬性也經常被添加。

請參閱Why use a whitelist for HTML sanitizing?

+0

請參閱編輯....... – chobo2 2010-06-10 23:13:11

4

該代碼是危險的 - 你應該白名單元素,而不是將它們列入黑名單。

換句話說,製作一個您想要允許的標籤和屬性的小列表,不要讓任何其他人通過。

編輯:我不熟悉HTML敏捷包,但我看不出爲什麼它不適用於此。因爲我不知道這個框架,所以我會給你僞代碼來做你需要做的事情。

doc.LoadHtml(html); 

var validTags = new List<string>(new string[] {"b", "i", "u", "strong", "em"}); 

var nodes = doc.DocumentNode.SelectAllNodes(); 
foreach(HtmlNode node in nodes) 
    if(!validTags.Contains(node.Tag.ToLower())) 
     node.Parent.ReplaceNode(node, node.InnerHtml); 

基本上,對於每個標籤,如果它不包含在白名單中,請用其內部的HTML替換該標籤。再次,我不知道你的框架,所以我不能給你具體細節,對不起。希望這會讓你開始朝正確的方向發展。

+0

請參閱編輯....... – chobo2 2010-06-10 23:14:05

+0

嗨。那麼對於標籤或類的屬性怎麼樣?如果你允許鏈接,會發生什麼,所以它會是hi這將看起來在有效標籤列表中?你也得到了所有的節點,但是一旦你檢查出來了,你把節點放回去了嗎?就像現在一樣,它們都與SelectAllNodes()的鏈接分開( – chobo2 2010-06-11 17:57:26

+0

)你使用什麼框架? Html敏捷包似乎沒有slectAllNodes – chobo2 2010-06-19 01:04:16