支持样式标记的HTML Sanitizer for .NET

我正在寻找一个在ASP.NET项目中使用的好的HTML清理程序。 问题在于清洁剂必须支持样式属性,该属性可能包含CSS属性,这些属性也必须进行清理。 到目前为止,我还没有找到一个好的产品。 在我咬紧牙关并编写自己的消毒剂之前,我想我可能会试着先看看这里的人们在使用什么。

我看过并拒绝的图书馆:

  • AntiXSS Library(旧版本不安全,新版本带样式标签)
  • AntiSamy .NET(未维护,缺少.NET版本中的必要function,具有过时的依赖性)
  • AjaxControlToolkit中的HTMLAgilityPackSanitizer(转义样式标记)

理想情况是使用基于白名单的清洁程序,该清理程序还根据已知值或正则表列表validation属性值。

有人能指出我正确的方向吗?

试试这个原生的.NET HTML Sanitizer项目 。 它可以根据需要理解样式属性(虽然它不会尝试保留STYLE标记,但它只是删除它们)。

此外,它是基于白名单的,而不是黑名单(它使用AngleSharp而不是现在已弃用的CsQuery)。 这也是Nuget !

查看CsQuery (我是其主要作者)作为操作HTML的工具。

这是一个.NET jQuery端口,它通过您在客户端上使用的相同方法(DOM和jQuery的API)为您提供对HTML的完全访问。 这样可以很容易地推出自己的消毒剂。

Rick Strahl最近发表了一篇关于消毒HTML的博客文章 。 他展示了如何使用HTML Agility Pack实现规则,我发布了一条评论,展示了如何使用CsQuery更轻松地实现相同的function。 基础知识就是这样,给出了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(); 

在Ricks的post中有更多用于清理javascript事件属性等等,但基本上CsQuery是一个工具箱,有一种熟悉且简单的操作HTML方式。 创建一个按照您想要的方式工作的消毒剂应该很容易。

CsQuery的DOM模型还包含直接访问样式的方法(例如,以比操作字符串更方便的方式),如果您需要执行诸如删除某些命名样式之类的操作。 例如,您可以从所有元素中删除“font-weight”样式:

 // 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(给定jQuery和C#之间的语言差异),并且公共API得到很好的评论,因此一旦开始就应该很容易编写代码。

但是有一些非标准方法(如“HasStyle”和“RemoveStyle”)是CsQuery独有的。 不过,在github上的自述文件中很好地介绍了基本用法。 它也在Nuget上作为CsQuery

Tatham Oddie ASP.Net MVP – http://blog.tatham.oddie.com.au/2009/06/15/released-xhtml-markup-sanitizer/

我现在把这个提到了一些人。 可能不会做你想要的一切,但Tatham是一个很棒的编码器所以它应该给你很多想法……

就在AntiXSS,AFAIK上,新版本在HTMLAgilityPackSanitizer中

尝试查看开放实验室博客上发布的HtmlSanitizer: http ://roberto.open-lab.com/2010/03/04/a-html-sanitizer-for-c/。 这个支持样式标记,非常适合用于html编辑器。

在CodeProject上查看Dead Simple HTML Sanitizer http://www.codeproject.com/Tips/529712/Dead-Simple-HTML-Sanitizer