2012-08-16 122 views
10

我正在寻找一个很好的HTML清理器来在ASP.NET项目中使用。问题在于,卫生消毒剂必须支持可能包含CSS属性的样式属性,这些属性也必须进行消毒处理。到目前为止,我还没有找到一个好的产品来使用。在我咬下子弹并写下自己的消毒剂之前,我想我可能会试着先看看这里的人在用什么。用于.NET的HTML Sanitizer支持样式标记

库,我已经看了,并拒绝:

  • AntiXSS库(旧版本是不安全的,新版本带风格的标记)
  • AntiSamy .NET(无人维护,缺乏在.NET必要的功能版本,拥有过时的依赖)
  • 的HTMLAgilityPackSanitizer在AjaxControlToolkit(逃逸风格标签)

理想的做法是有一个基于白名单消毒剂塔t还会根据已知值或正则表达式的列表验证属性值。

任何人都能指出我正确的方向吗?

+0

[HTML整洁(http://tidy.sourceforge.net/)是旧的,但我已经成功使用过它。 – transistor1 2012-08-16 03:18:15

+0

虽然我不确定这是我在找什么。这里的主要目标是确保用户输入不包含可执行脚本。 HTML Tidy看起来不错,但似乎有一个非常不同的目的。 – 2012-08-16 16:40:52

回答

0

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

现在我已经提到这几个人。可能不是你想要的一切,但泰胜的一个真棒编码器,所以应该给你很多的想法......

刚上AntiXSS,据我所知,新版本在HTMLAgilityPackSanitizer

+0

谢谢,但这些都不适合我的目的,因为它们都在属性内编码特殊字符。这对安全性很好,因为在样式属性中有很多XSS黑客可以做,但我需要能够允许这些好东西。 :-( – 2012-08-16 04:27:57

3

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

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

Rick Strahl最近有一个blog post关于消毒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的解包。这将有删除标签,但保留其子女的影响。

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(鉴于jQuery和C#之间的语言差异),并且公共API得到了很好的评论,所以它应该足够简单,以便在开始时进行编码。

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

+0

很酷,如果我最终滚动了我自己的消毒剂,那看起来好像是一个很好的工具, – 2012-08-16 15:58:17

+0

我打算让这个去做一下我自己的白名单消毒剂,我假设我可以使用“全部”选择​​器,然后迭代和解包任何不在我的白名单(或可能使用非谓词选择器,如果它们存在?) – Schneider 2012-10-30 12:41:50

+0

我想不出一个不起作用的理由,我没有一个很好的意识是,这样做是否会比使用标签选择器仅仅定位您想要的标签(与我给出的黑名单示例相同的技术)相比效率更高或更低,可能取决于好坏比例,但对于这个目的可能是如此少量的内容,它不会真的影响任何一方。 – 2012-10-30 16:59:50

0

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

+0

谢谢。这是我见过的最接近的,但我不是黑名单方法的粉丝。例如,即使您可以通过行为在IE中执行脚本,它也不会将“行为”视为风格属性中的禁用字符串。你可以做的其他事情可能是我和作者不知道的。我也担心它不能正确解析HTML。它可能仍然有效,但是如果你可以愚弄解析器(比如说,将一个“>”字符放在一个属性值中,它会认为该标签被关闭),那么你可以欺骗消毒剂。 – 2012-08-17 16:00:20

+0

由于我无法编辑我的评论,我重写了它:那么在这种情况下,我认为除了选择一个库作为基础并根据需要定制它之外,没有其他办法。这可能有点工作,但这是你真正得到你想要的东西的唯一方法。我们在工作时做了同样的事情(可惜我不能分享这些代码)。 – Rutix 2012-08-18 18:12:00

+0

是的,那就是我最终做的。我只是希望有更好的办法。 – 2012-08-18 18:56:43

4

尝试this native .NET HTML Sanitizer project。它可以根据需要理解样式属性(尽管它不尝试并保留STYLE标签,但它只是将其删除)。

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