【发布时间】:2011-02-27 01:40:02
【问题描述】:
我想知道是否有任何类型的 C# 类或 3rd 方库可以删除脚本标签等危险字符?
我知道你可以使用正则表达式,但我也知道人们可以用多种方式编写他们的脚本标签,以至于你可以欺骗正则表达式认为它是可以的。
我还听说HTML Agility Pack 很好,所以我想知道是否有任何脚本删除类针对它?
编辑
http://htmlagilitypack.codeplex.com/Thread/View.aspx?ThreadId=24346
我在他们的表格上找到了这个。但是我不确定这是否是完整的解决方案,因为这家伙没有任何测试来备份它,如果这是在某个网站上,每天都有很多人使用这个脚本来测试是否有任何东西会更好由。
很好的例子(几乎),谢谢!一些 让我看到的更强大的方法, 不过:
1) 在以下情况下使用不区分大小写的搜索 寻找带有“javascript:”的链接, “vbscript:”,“jscript:”。例如, 原始示例不会删除 HTML:
<a href="JAVAscRipt:alert('hi')">click> me</a>2) 删除任何样式属性 包含表达式规则。互联网 Explorer 评估 CSS 规则 表达为脚本。例如, 以下将产生一个消息框:
<div style="width:expression(alert('hi'));">bad> code</div>3) 同时删除标签
我真的不知道为什么 “表达式”尚未从 IE - 我认为的主要缺陷。 (尝试 Internet Explorer 中的 div 示例 你会明白为什么 - 甚至是 IE8。)我 只希望有一个更简单/标准 清理来自 a 的 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();
}
【问题讨论】:
-
可以使用这里提到的HTML转义功能:stackoverflow.com/questions/1005264/escape-text-for-html
-
你到底想做什么?您只是想清理用户输入,还是在抓取网页?
-
清理危险标签,但不处理 html 标签,如粗体和其他丰富的 html 标签。
标签: c# .net javascript asp.net-mvc security