6

我遇到了一种常见情况,即我有使用 HTML 子集的用户输入(使用 tinyMCE 输入)。我需要对 XSS 攻击进行一些服务器端保护,并且正在寻找人们用来执行此操作的经过良好测试的工具。在 PHP 方面,我看到很多像 HTMLPurifier 这样的库可以完成这项工作,但我似乎在 .NET 中找不到任何东西。

我基本上是在寻找一个库来过滤到标签的白名单,这些标签上的属性,并用“困难”属性做正确的事情,比如 a:href 和 img:src

我在http://refactormycode.com/codes/333-sanitize-html上看到了 Jeff Atwood 的帖子,但我不知道它是最新的。它与网站当前使用的内容有任何关系吗?无论如何,我不确定我是否对尝试正则表达式输出有效输入的策略感到满意。

这篇博文列出了一个似乎更引人注目的策略:

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,那就太好了。如果没有,没什么大不了的——我可以要求格式良好的 HTML,因为用户应该使用 tinyMCE 编辑器。无论哪种情况,我都在重写我所知道的安全、格式良好的 HTML。

问题是这只是一个描述,没有链接到任何实际执行该算法的库。

有这样的图书馆吗?如果没有,什么是好的 .NET HTML 解析引擎?应该使用哪些正则表达式来执行额外的验证 a:href、img:src?我在这里错过了其他重要的事情吗?

我不想在这里重新实现一个越野车轮子。当然,那里有一些常用的库。有任何想法吗?

4

6 回答 6

5

我们正在使用HtmlSanitizer .Net 库,它:

同样在NuGet上

于 2015-03-02T22:47:08.423 回答
3

Microsoft 有一个开源库来防止 XSS:AntiXSS

于 2009-08-22T08:10:47.247 回答
3

好吧,如果您想解析,并且担心会出现无效的 (x)HTML,那么HTML Agility Pack可能是用于解析的最佳选择。请记住,虽然它不仅是元素,还包括您需要允许的允许元素的属性(当然,您应该使用允许的元素及其属性的白名单,而不是试图通过黑名单去除可能不可靠的东西)

还有一个正在进行中的OWASP AntiSamy 项目——他们也有一个测试站点,你可以尝试 XSS

正则表达式可能太冒险了 IMO。

于 2009-08-22T08:14:00.047 回答
2

http://www.microsoft.com/en-us/download/details.aspx?id=28589 您可以在此处下载一个版本,但我将其链接为有用的 DOCX 文件。我的首选方法是使用 NuGet 包管理器来获取最新的 AntiXSS 包。

您可以使用 4.x AntiXss 库中的 HtmlSanitizationLibrary 程序集。请注意,GetSafeHtml() 位于 Microsoft.Security.Application.Sanitizer 下的 HtmlSanitizationLibrary 中。

于 2012-06-23T07:08:40.620 回答
1

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

.Net 似乎仍然没有任何像样的 XSS / HTML 白名单解决方案,所以我上传了一个我创建并使用了几年的解决方案。

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

白名单定义基于 TinyMCE 的有效元素。

拿两个:环顾四周,微软最近发布了一个基于白名单的 Anti-XSS 库(V3.0),看看:

Microsoft Anti-Cross Site Scripting Library V3.0 (Anti-XSS V3.0) 是一个编码库,旨在帮助开发人员保护其基于 ASP.NET Web 的应用程序免受 XSS 攻击。它与大多数编码库的不同之处在于它使用白名单技术(有时称为包含原则)来提供针对 XSS 攻击的保护。这种方法的工作原理是首先定义一组有效或允许的字符,然后对该组之外的任何内容(无效字符或潜在攻击)进行编码。白名单方法提供了优于其他编码方案的几个优点。此版本的 Microsoft 反跨站点脚本库中的新功能包括:

于 2009-08-22T07:53:38.747 回答
0

https://github.com/Vereyon/HtmlRuleSanitizer正好解决了这个问题。

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

Microsoft Web 保护库(以前的 AntiXSS)似乎简单地撕掉了几乎所有的 HTML 标记,并且从我读到的内容中,您无法轻松地将规则定制为您想要使用的 HTML 子集。所以这对我来说不是一个选择。

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

于 2015-02-23T22:35:17.237 回答