.NET HTML白名单(反XSS / 跨站脚本)

6
我遇到了一个常见的情况,即用户输入使用HTML子集(使用tinyMCE)。 我需要在服务器端提供一些防止XSS攻击的保护,并正在寻找人们正在使用的经过充分测试的工具。 在PHP方面,我看到了许多库,如HTMLPurifier,可以完成这项工作,但是我似乎无法在.NET中找到任何东西。
我基本上正在寻找一个库,以将标签,这些标签上的属性过滤为白名单,并针对“困难”的属性(例如a:href和img:src)执行正确的操作。
我看过Jeff Atwood在http://refactormycode.com/codes/333-sanitize-html上发布的帖子,但我不知道它有多新。 它是否与网站当前使用的内容有任何关系? 无论如何,我不确定我是否愿意尝试通过正则表达式来验证有效输入的策略。
此博客文章阐述了一个更加令人信服的策略: http://blog.bvsoftware.com/post/2009/01/08/How-to-filter-Html-Input-to-Prevent-Cross-Site-Scripting-but-Still-Allow-Design.aspx 这种方法是将HTML解析为DOM,验证其有效性,然后从中重建有效的HTML。 如果HTML解析可以合理地处理格式不正确的HTML,则很好。 如果不能,那没关系 - 我可以要求使用tinyMCE编辑器的用户使用格式正确的HTML。 在任何情况下,我都在重新编写安全的、格式正确的HTML。
问题是这只是一个描述,没有链接到实际执行该算法的任何库。
是否存在这样的库? 如果没有,什么是一个好的.NET HTML解析引擎? 应该使用哪些正则表达式来执行额外的验证a:href,img:src? 我还缺少其他重要的东西吗?
我不想在这里重新实现有漏洞的轮子。 肯定有一些常用的库。 有什么想法吗?
6个回答

6

3

微软有一个开源库来防止XSS攻击:AntiXSS


2
AntiXSS只是编码,不是剥离器或白名单解决方案(尚未)。 - blowdart
1
好的,谢谢。我自己还没有使用过它,所以我可能只应该推荐我熟悉的东西。 - Tommy Carlier
想指出的是,以目前的形式来看,这个库似乎相当无用(请参见该链接中的评论和评价)。 - George Mauer
AntiXss确实带有白名单过滤器。我正在使用它。 - Brandon
@Brandon,如何在AntiXss中将内容添加到白名单?你能提供相关链接或示例吗?我已经尝试了一些谷歌搜索,但是没有找到白名单修改的方法。:( - Anish V
Anish V:对不起,已经有一段时间了。我查看了我们的代码,无法修改它使用的白名单。我想我当时写下那个评论的意思是它使用了白名单策略。如果我给你带来了错误的希望,我很抱歉。 - Brandon

3
如果您想解析HTML文本,而且担心输入的内容不符合(x)HTML规范,那么HTML Agility Pack可能是最好的解析工具。但请记住,您需要允许一些元素和它们的属性(当然,应该使用白名单来控制允许的元素和属性,而不是黑名单来过滤不良内容)。

此外,OWASP AntiSamy Project也是一个正在进行的项目,他们还提供了一个测试站点,以便测试跨站脚本攻击。

在我看来,使用正则表达式处理HTML文本可能会太冒险了。


敏捷包是我最终使用的。看起来运行良好。 - Clyde

2
您可以在此处下载一个版本,但我链接了有用的DOCX文件。我更喜欢使用NuGet软件包管理器获取最新的AntiXSS软件包。
您可以使用4.x AntiXss库中找到的HtmlSanitizationLibrary程序集。请注意,GetSafeHtml()在HtmlSanitizationLibrary中,在Microsoft.Security.Application.Sanitizer下。

1

几年前我使用TinyMCE时也遇到了完全相同的问题。

目前似乎还没有任何适用于.Net的合适的XSS / HTML白名单解决方案,因此我上传了一个我创建并使用了几年的解决方案。

http://www.codeproject.com/KB/aspnet/html-white-listing.aspx

白名单定义基于TinyMCE的valid-elements。

再看一下,微软最近发布了基于白名单的Anti-XSS库(V3.0),可以去看看:

Microsoft Anti-Cross Site Scripting Library V3.0(Anti-XSS V3.0)是一个编码库,旨在帮助开发人员保护他们的ASP.NET基础Web应用程序免受XSS攻击。它与大多数编码库不同之处在于,它使用白名单技术 - 有时称为包含原则 - 来提供对XSS攻击的保护。该方法首先通过定义有效或允许的字符集来工作,并对此集合之外的任何内容进行编码(无效字符或潜在攻击)。白名单方法相对于其他编码方案具有几个优点。Microsoft Anti-Cross Site Scripting Library此版本的新功能包括:-支持更多语言的扩展白名单-性能改进-性能数据表(在线帮助中)-支持Shift_JIS编码以用于移动浏览器-示例应用程序-安全运行时引擎(SRE)HTTP模块


0

https://github.com/Vereyon/HtmlRuleSanitizer 确切地解决了这个问题。

当我在一个ASP.NET MVC应用程序中集成wysihtml5编辑器时,我遇到了这个挑战。我注意到它有一个非常好的、简单的基于白名单的清洁工,它使用规则来允许通过一部分HTML。我实现了一个服务器端版本,它依赖于HtmlAgility包进行解析。

Microsoft Web Protection Library (前AntiXSS)似乎只是剥离了几乎所有的HTML标签,从我所读到的内容来看,你不能轻松地定制要使用的HTML子集的规则。所以这对我来说不是一个选择。

这个HTML清洁工看起来也很有前途,会是我的第二选择。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接