我一直在發現,對於我認爲很重要的東西,很少有關於如何處理這個問題的信息或庫。這可以改善嗎?清理危險的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#中完成的教程(我最後一次看。再次檢查出來)。
你如何製作白名單?它只是一個列表集合?
你如何實際解析出所有的html標籤,腳本標籤和其他標籤?
一旦你有標籤,你如何確定哪些是允許的?將它們與您的收藏列表進行比較但是,如果內容進入並具有100個標籤並且您有50個標籤,會發生什麼情況。你必須將50個標籤中的每一個與50個允許的標籤進行比較。這有點過了,可能會很慢。
一旦發現無效標籤,您如何刪除它?如果發現一個標籤無效,我並不想拒絕整套文本。我寧願刪除並插入其餘的。
我應該使用html敏捷包嗎?
請參閱編輯....... – chobo2 2010-06-10 23:13:11