【发布时间】:2010-06-10 22:53:12
【问题描述】:
我发现对于我认为非常重要的东西,关于如何处理这个问题的信息或库很少。
我在搜索时发现了这个。我真的不知道黑客可以尝试插入危险标签的所有数百万种方法。
我有一个丰富的 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 个允许,会发生什么情况。您必须将这 100 个标签中的每一个与 50 个允许的标签进行比较。这是相当多的过程,可能会很慢。
一旦你发现一个无效标签,你如何删除它?如果发现一个标签无效,我真的不想拒绝一整套文本。我宁愿删除并插入其余部分。
我应该使用 html 敏捷包吗?
【问题讨论】:
标签: c# .net javascript security