我在寻找一个良好的HTML消毒剂在ASP.NET项目中使用。 美中不足的是,消毒剂必须支持样式属性,其中可能包含CSS属性,这也必须消毒。 到目前为止,我一直没能找到一个很好的产品配套使用。 之前,我硬着头皮写我自己的消毒剂,我想我可能会尝试,看看这里的人正在使用的第一件事。
我已经看了,并拒绝图书馆:
- AntiXSS库(旧版本是不安全的,新版本带样式代码)。
- AntiSamy .NET(无人维护,缺乏.NET版本的必要特征,有过时的依赖)
- 该HTMLAgilityPackSanitizer在AjaxControlToolkit(逃逸样式代码)。
理想的办法是有一个基于白名单,洗手液也验证对已知值或正则表达式的列表属性值。
任何人都可以点我在正确的方向?
试试这个本地.NET HTML消毒剂项目 。 这可以理解样式属性,只要你想(尽管它不会尝试并保持风格的标记,它只是删除它们)。
此外,它是一个基于白名单,而不是黑名单(它使用AngleSharp代替CsQuery现在已不建议)。 这也是对的NuGet !
看看CsQuery (其中我的主要作者)为操作HTML的工具。
这是一个.NET jQuery的端口,它提供给你通过你的客户端(DOM和jQuery的API)上使用相同的方法的完整访问HTML。 这使得它很容易推出自己的消毒剂。
里克施特拉尔有一个博客帖子最近关于清理HTML。 他展示了如何使用HTML敏捷性包他的规则去做,我发布的评论也显示如何使用CsQuery更轻松地实现同样的事情。 基础知识只是这一点,给标签的枚举BlackList
:
CQ doc = CQ.Create(html);
// creates a grouped selector "iframe,form,script, ..."
string selector = String.Join(",",BlackList);
// CsQuery uses the property indexer as a default method, it's identical
// to the "Select" method and functions like $(...)
doc[selector].Remove();
如果你不想在一些标签实际上移除内容,例如格式化也许你希望禁止标签,你可以使用jQuery的展开来代替。 这将有删除标签,但保留其子女的影响。
doc[selector].UnWrap();
当你完成:
string cleanHtml = doc.Render();
还有更多的里克斯后清理JavaScript事件属性等等,但基本上CsQuery是一个熟悉而又简单的方式来操作HTML的工具箱。 它应该是很容易的创建你所希望的方式工作的消毒剂。
CsQuery的DOM模型还包含方法来直接访问样式(例如,在一个更方便的方式不仅仅是操纵字符串),如果你需要做类似的东西删除某些指定的样式。 例如,你可以从所有元素中删除“字体重量”的风格:
// use the [attribute] selector to target only elements with styles
foreach (IDomObject element in doc["[style]"]) {
if (element.HasStyle("font-weight")) {
element.RemoveStyle("font-weight");
}
}
CsQuery的主要缺点,现在是文档。 它的API设计到浏览器的DOM和jQuery尽可能与作为,以及公共API可能(jQuery和C#之间给定的语言differnces)有很好的注释,所以它应该很容易打击,一旦你走了代码。
但也有非标准的方法极少数(如“HasStyle”和“RemoveStyle”这)是唯一的CsQuery。 基本用法覆盖相当不错在GitHub上的自述,虽然。 这也是对的NuGet为CsQuery
。
泰胜Oddie ASP.Net MVP - http://blog.tatham.oddie.com.au/2009/06/15/released-xhtml-markup-sanitizer/
现在我已经提到这几个人。 可能不是你想要的一切,但泰胜是一个真棒编码器,所以应该给你很多的想法......
刚上AntiXSS,据我所知,新版本在HTMLAgilityPackSanitizer
试着看HtmlSanitizer贴在开放实验室博客: http://roberto.open-lab.com/2010/03/04/a-html-sanitizer-for-c/ 。 这一个支持的风格标签,是相当不错的使用对HTML编辑器。
退房死的简单的HTML消毒剂在CodeProject http://www.codeproject.com/Tips/529712/Dead-Simple-HTML-Sanitizer