11

我正在寻找在 ASP.NET 项目中使用的好的 HTML sanitizer。问题是清理程序必须支持样式属性,其中可能包含 CSS 属性,也必须对其进行清理。到目前为止,我还没有找到一个好的产品来使用。在我硬着头皮写自己的消毒剂之前,我想我可能会先看看这里的人在用什么。

我看过并拒绝的图书馆:

  • AntiXSS 库(旧版本不安全,新版本去除样式标签)
  • AntiSamy .NET(未维护,在 .NET 版本中缺少必要的功能,具有过时的依赖项)
  • AjaxControlToolkit 中的 HTMLAgilityPackSanitizer(转义样式标签)

理想的情况是拥有一个基于白名单的清理程序,该清理程序还可以根据已知值或正则表达式列表验证属性值。

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

4

5 回答 5

5

试试这个本机 .NET HTML Sanitizer 项目。它可以根据需要理解样式属性(尽管它不会尝试保留 STYLE 标记,它只是删除它们)。

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

于 2013-09-26T07:46:28.707 回答
3

将 CsQuery(我是它的主要作者)视为一种用于处理 HTML 的工具。

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

Rick Strahl最近发表了一篇关于清理 HTML的博客文章。他展示了如何使用 HTML Agility Pack 使用他的规则来做到这一点,我在那里发表了一条评论,展示了如何使用 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 的 unwrap 代替。这将具有删除标签但保留其子标签的效果。

doc[selector].UnWrap();

完成后:

string cleanHtml = doc.Render();

Ricks 的帖子中有更多关于清理 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(考虑到 jQuery 和 C# 之间的语言差异),并且公共 API 有很好的注释,所以一旦你开始使用它应该很容易编写代码。

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

于 2012-08-16T15:36:39.197 回答
0

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

我现在已经把这个介绍给了几个人。可能不会做你想做的一切,但 Tatham 是一个很棒的编码器,所以它应该给你很多想法......

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

于 2012-08-16T03:05:02.257 回答
0

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

于 2012-08-17T12:31:13.427 回答
0

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

于 2014-12-19T14:15:14.923 回答