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

时间:2015-07-16 20:21:26

标签: asp.net-mvc xss

我有CMS系统,我使用CK编辑器输入数据。现在,如果用户在[Derived Column 1 [17270]] Error: SSIS Error Code DTS_E_INDUCEDTRANSFORMFAILUREONERROR. The "component "Derived Column 1" (17270)" failed because error code 0xC0049063 occurred, and the error row disposition on "input column "EDTE" (17809)" specifies failure on error. An error occurred on the specified object of the specified component. There may be error messages posted before this with more information about the failure. 中键入,则CKEditor执行公平的工作并正确编码并将<script>alert('This is a bad script, data');</script>传递给服务器。

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

Edit CKEditor contents thru inspect element

到目前为止,我尝试了很多不同的东西

  • 使用AntiXssEncoder [&lt;script&gt;alert(&#39;This is a bad script, data&#39;)&lt;/script&gt;]对内容进行编码,然后将其存储在数据库中,当在浏览器中显示时,将其解码并使用MvcHtmlString.Create [HttpUtility.HtmlEncode(Contents)]或Html显示。您可以预期Raw [MvcHtmlString.Create(HttpUtility.HtmlDecode(Contents))]会显示JavaScript警报。

我不想将Html.Raw(Contents)手动代码替换为not comprehensive solution(搜索&#34;以及编码状态:&#34;)。

到目前为止,我已经提到了很多文章(抱歉没有在这里列出所有文章,但只是添加了一些作为证明我在写这个问题之前付出了真诚努力的证据),但没有一个代码能够显示答案。可能有一些简单的答案,我没有找到正确的方向,或者可能不是那么简单,我可能需要使用像Content Security Policy这样的东西。

ASP.Net MVC Html.Raw with AntiXSS protection Is there a risk in using @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-encoding-in-asp-net-mvc/

要重现我所说的内容,请转到* this url并在文本框中输入<script>,然后点击按钮。

*此链接来自Michael Kennedy的博客

1 个答案:

答案 0 :(得分:3)

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

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

  • 仅支持固定的Html子集
  • 用户提交内容后,解析Html并根据允许的标签和属性列入白名单。
  • 在过滤和消除任何你不确定的事情上是无情的。

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

大约十年前,我试图编写自己的白名单过滤器。它解析并规范化输入的Html。然后,它删除了不在允许的白名单上的任何元素或属性。它工作得很好,但你永远不知道你错过了哪些漏洞。那个项目已经很久了,但如果我不得不这样做,我会使用现有的更简单的标记语言而不是Html。

有很多方法可以让用户在你的页面中注入令人讨厌的东西,你必须要凶狠地防止这种情况发生。甚至可以使用CSS将可执行表达式注入到页面中,例如:

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

Here is a page with a list of known attacks会让你夜不能寐。如果您无法过滤和阻止所有这些,则您尚未准备好让不受信任的用户发布公众可以查看的格式化内容。

在我使用自己的过滤器的时候,MySpace(哇我已经老了)被称为Samy的XSS蠕虫击中。 Samy使用具有javascript有效负载的嵌入式背景Url的Style属性。全是explained by the author

请注意,您的example page说:

  

此页面意味着接受并显示信任的原始HTML   编辑器。

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