Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 支持样式标记的.NET HTML净化程序_C#_.net_Css_Vb.net_Security - Fatal编程技术网

C# 支持样式标记的.NET HTML净化程序

C# 支持样式标记的.NET HTML净化程序,c#,.net,css,vb.net,security,C#,.net,Css,Vb.net,Security,我正在寻找一个好的HTML消毒剂在ASP.NET项目中使用。问题是,消毒器必须支持样式属性,其中可能包含CSS属性,也必须对其进行消毒。到目前为止,我还没有找到一个好的产品使用。在我咬紧牙关写我自己的消毒剂之前,我想我可以先看看这里的人在用什么 我查看并拒绝的库: AntiXSS库(旧版本不安全,新版本带样式标记) AntiSamy.NET(未维护,在.NET版本中缺少必要的功能,具有过时的依赖项) AjaxControlToolkit中的HtmlAlityPackSanitizer(转义样式

我正在寻找一个好的HTML消毒剂在ASP.NET项目中使用。问题是,消毒器必须支持样式属性,其中可能包含CSS属性,也必须对其进行消毒。到目前为止,我还没有找到一个好的产品使用。在我咬紧牙关写我自己的消毒剂之前,我想我可以先看看这里的人在用什么

我查看并拒绝的库:

  • AntiXSS库(旧版本不安全,新版本带样式标记)
  • AntiSamy.NET(未维护,在.NET版本中缺少必要的功能,具有过时的依赖项)
  • AjaxControlToolkit中的HtmlAlityPackSanitizer(转义样式标记)
理想情况是有一个基于白名单的消毒剂,它还可以根据已知值或正则表达式列表验证属性值


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

塔塔姆奥迪ASP.Net MVP-

我已经把这件事告诉了一些人。可能不会做你想做的一切,但塔瑟姆是一个了不起的程序员,所以它应该给你很多的想法

就在AntiXSS上,新版本在HTMLAgilityPackSanitizer中

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

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

Rick Strahl最近有一个关于清理HTML的问题。他用HTML Agility Pack演示了如何使用他的规则,我在那里发布了一条评论,展示了如何更轻松地使用CsQuery实现同样的功能。基本情况就是这样,给出了标签的枚举
黑名单

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的帖子中还有更多关于清理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

请尝试查看OpenLab博客上发布的HtmlSanitizer:。这一个支持样式标记,非常适合用于html编辑器

试试看。它可以根据您的需要理解样式属性(虽然它不尝试保留样式标记,但只是删除它们)


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

查看CodeProject上的死简单HTML消毒剂很旧,但我成功地使用了它。不过,我不确定它是否是我想要的。这里的主要目标是确保用户输入不包含可执行脚本。HTMLTidy看起来不错,但似乎有一个非常不同的目的。谢谢,但它们都不适合我的目的,因为它们都在属性中编码特殊字符。这对安全性有好处,因为在样式属性中可以进行大量XSS攻击,但我需要能够允许好的东西:-(很酷。如果我最终使用了我自己的消毒剂,这似乎是一个很好的研究工具。我将尝试一下,制作我自己的白名单消毒剂。我假设我可以使用一个“全部”选择器,然后迭代并解包我白名单中的任何非(或者可能使用一个非谓词选择器,如果它们存在的话?)我想不出一个不起作用的理由。我不知道这是否比使用标记选择器只针对您想要的标记更有效(与我给出的黑名单示例相同的技术),可能取决于好坏的比例,但为此目的,它可能是如此少量的内容,无论哪种方式都无关紧要。展开是否实现了此处的目的?似乎展开会移除父项,而不是标记本身。我认为上面的示例代码应为:
doc[selector].Contents.Unwrap()谢谢。这是我最近看到的,但我不是黑名单的粉丝。例如,它不考虑“行为”。成为样式属性中的禁止字符串,即使你可以通过行为在IE中执行脚本。可能还有其他事情你可以做,我和作者都不知道。我还担心它不能正确解析HTML。它可能仍然有效,但如果你能愚弄解析器(比如,放一个“>”)属性值中的字符,它将考虑要关闭的标记。然后你可以愚弄消毒剂。因为我无法编辑我的评论,我重写了它:在这种情况下,我认为除了选择一个库作为基础并根据你的需要定制它之外,没有其他方法。这可能需要一些工作,但这是你真正得到你想要的东西的唯一方法。我们在工作中也做了同样的事情(遗憾的是,我无法共享该代码).是的,这就是我最后做的。我只是希望有更好的方法。