防止XSS攻击并仍然使用Html.Raw

ndd*_*ndd 5 xss asp.net-mvc

我有CMS系统,正在使用CK编辑器输入数据。现在,如果用户输入内容,<script>alert('This is a bad script, data');</script>则CKEditor会完成公平的工作并正确编码并将其传递&lt;script&gt;alert(&#39;This is a bad script, data&#39;)&lt;/script&gt;给服务器。

但是,如果用户进入浏览器开发人员工具(使用Inspect元素)并将其添加到其中,如下面的屏幕截图所示,则这是所有麻烦开始的时候。现在,从数据库检索回来后,当它显示在浏览器中时,它会显示警告框。

通过检查元素编辑CKEditor内容

到目前为止,我已经尝试了许多不同的方法,其中之一是

  • 使用AntiXssEncoder [ HttpUtility.HtmlEncode(Contents)] 对内容进行编码,然后将其存储在数据库中,然后在浏览器中显示时,对其进行解码,然后使用MvcHtmlString.Create [ MvcHtmlString.Create(HttpUtility.HtmlDecode(Contents))]或Html.Raw [ Html.Raw(Contents)]对其进行显示,因为您可能希望它们都显示JavaScript警报。

我不想替换<script>手动通过代码,因为它不是全面的解决方案(搜索“和编码状态:”)。

到目前为止,我已经引用了许多文章(很抱歉,这里没有列出所有文章,只是添加了很少的证据来表明我在写这个问题之前已经做出了认真的努力),但是没有一篇文章提供显示答案的代码。可能有一些简单的答案,我的方向不是正确的,或者根本不是那么简单,我可能需要使用诸如内容安全策略之类的东西。

具有AntiXSS保护的ASP.Net MVC Html.Raw 是否有使用@ Html.Raw的风险? http://blog.simontimms.com/2013/01/21/content-security-policy-for-asp-net-mvc/ http://blog.michaelckennedy.net/2012/10/15/understanding-text-在asp-net-mvc中编码/

要重现我的意思,请转至* 此url并在文本框中输入<script>alert('This is a bad script, data');</script>并单击按钮。

*此链接来自迈克尔·肯尼迪的博客

Mat*_*t D 6

我设法使用 NuGet 中的 HtmlSanitizer 解决了这个问题:

https://github.com/mganss/HtmlSanitizer

根据 OWASP 基金会的建议(我需要的好建议):

https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet#RULE_.236_-_Sanitize_HTML_Markup_with_a_Library_Designed_for_the_Job

首先,添加 NuGet 包:

> Install-Package HtmlSanitizer
Run Code Online (Sandbox Code Playgroud)

然后我创建了一个扩展方法来简化事情:

using Ganss.XSS;

...

public static string RemoveHtmlXss(this string htmlIn, string baseUrl = null)
{
    if (htmlIn == null) return null;
    var sanitizer = new HtmlSanitizer();
    return sanitizer.Sanitize(htmlIn, baseUrl);
}
Run Code Online (Sandbox Code Playgroud)

然后,当 HTML 发布时,我在控制器内进行验证:

var cleanHtml = model.DodgyHtml.RemoveHtmlXss();
Run Code Online (Sandbox Code Playgroud)

为了完整起见,每次将其呈现到页面时都要进行清理,尤其是在使用 Html.Raw() 时:

<div>@Html.Raw(Model.NotSoSureHtml.RemoveHtmlXss())</div>
Run Code Online (Sandbox Code Playgroud)


Mic*_*evy 4

这并不容易,而且您可能不想这样做。我可以建议您使用比 HTML 更简单的语言来进行最终用户格式化输入吗?Stackoverflow使用的 Markdown 怎么样(我相信)。或者现有的 Wiki 或其他轻量级标记语言之一?

如果您允许 Html,我建议如下:

  • 只支持 Html 的固定子集
  • 用户提交内容后,解析 Html 并根据允许的标签和属性的白名单对其进行过滤。
  • 毫不留情地过滤和消除任何你不确定的东西。

现有的工具和库可以做到这一点。我没有使用过它,但我偶然发现了http://htmlpurifier.org/。我想还有很多其他人。Rick Strahl发布了一个.NET 示例,但我不确定它是否完整。

大约十年前,我尝试编写自己的白名单过滤器。它解析并规范输入的 Html。然后它删除了不在允许的白名单上的所有元素或属性。它工作得很好,但你永远不知道你错过了哪些漏洞。该项目早已结束,但如果我必须重来,我会使用现有的更简单的标记语言而不是 Html。

用户可以通过多种方式向您的页面注入令人讨厌的内容,您必须坚决阻止这种情况发生。甚至 CSS 也可用于将可执行表达式注入到您的页面中,例如:

<STYLE type="text/css">BODY{background:url("javascript:alert('XSS')")}</STYLE>
Run Code Online (Sandbox Code Playgroud)

这是一个包含已知攻击列表的页面,这些攻击会让您彻夜难眠。如果您无法过滤和阻止所有这些情况,那么您还没有准备好让不受信任的用户发布可供公众查看的格式化内容。

就在我开发自己的过滤器时,MySpace(哇,我老了)遭到了名为Samy的 XSS 蠕虫攻击。Samy 使用带有嵌入式背景 Url 的 Style 属性,该 Url 具有 javascript 有效负载。一切都由作者解释

请注意,您的示例页面显示:

此页面旨在接受并显示由可信 编辑器编写的原始 HTML。

这里的关键问题是信任。如果您的所有用户都是可信的(例如网站的员工),那么这里的风险就会较低。但是,如果您正在构建论坛、社交网络、交友网站或任何允许不受信任的用户输入其他人可以查看的格式化内容的内容,那么您就很难清理 Html。