【问题标题】:ASP.NET MVC XSS Input Field strip HTML/Scripts or SanitizeASP.NET MVC XSS 输入字段去除 HTML/脚本或清理
【发布时间】:2015-02-26 11:23:35
【问题描述】:

我正在使用 ASP.NET MVC AntiXssEncoder 来防止重新生成表单上 INPUT 字段的 XSS

但是,当用户在更新页面上看到以下内容时:

Input Test <b>abc</b>

这种情况的最佳做法是什么? 1. 清理或删除所有 HTML 和脚本标签

谢谢。

【问题讨论】:

  • 需要更多帮助吗?如果是这样,我会更新我的答案。

标签: asp.net-mvc-4 xss antixsslibrary


【解决方案1】:

当您为正在处理的应用程序建立威胁模型或构建威胁配置文件时,您正在与之交互和通信的系统(应用程序、网页)上会一目了然。您将了解您从中接收输入的地方,您将了解您正在输出的地方。你可以决定是否

  1. 您想清理输入并将其存储在数据库中
  2. 或者只是在数据库中存储恶意输入(记住即使<script>script('foo')</script>在数据库中,当它反映在页面上时仍然是恶意的)在数据库中,然后阻止它在浏览器中显示时执行或网络应用程序。

给出一个结论性的答案并不是很容易给出一个结论性的答案,即您应该在将输入字符串放入数据库之前对其进行清理(例如,如果用户输入字符串 Alex <script>window.location='http://evil.com';</script> 那么你应该只存储 Alex 并从输入的字符串中清除恶意输入,然后将其存储在数据库中)或者不要担心输入净化,取决于输出编码。

但最佳做法是深入实施安全性,在多个 层。理想情况下,您应该进行输入清理和输出 编码也是如此。因为你可能永远不知道如果你不这样做 输入清理,您在数据库中的恶意脚本可能会得到 反映在您也提供数据的其他一些应用程序中。

说了这么多故事,在你的情况下,我认为你想在输出中看到的不是Input Test <b>abc</b>,而是你想看到<b>abc</b>. 当你查看页面的响应(html 源代码)时,你应该有Input Test <b>abc</b>,它将在浏览器中显示为abc

但是,如果您在浏览器中看到 Input Test <b>abc</b>,那么我认为您的响应(使用 fiddler 捕获的视图源选项)是 <b>abc</b> 。如果是这种情况,那么您将遇到 双重编码(实际上是双重 html 输出编码)的问题。如果您使用的是 Razor 视图引擎,那么除非您执行 Html.Raw ... 默认情况下,您输出的每个字符串都将使用 Razor 视图引擎的 @ 语法进行编码输出。如果您使用的是 aspx 视图引擎,那么您放在脚本块 <%: %> 中的任何内容都将被输出编码。

我认为您关于最佳实践的问题已得到解答。如果您想了解其他任何内容(与此问题相关),请评论编辑问题。

【讨论】:

    【解决方案2】:

    清理输出,而不是输入。

    <script>alert(foo)</script> 存储在您的数据库中是安全的——在那里没有任何意义。

    只有当您将其输出到 HTML 页面时,您才需要对特殊字符进行编码。即你需要输出

    <script>alert(foo)</script>
    

    所以

    <script>alert(foo)</script>
    

    在您的页面中显示执行。

    这样,如果您需要输出到一个文本文件,那么您就不会将&amp;lt;script&amp;gt;alert(foo)&amp;lt;/script&amp;gt; 打印到页面而不是&amp;lt;script&amp;gt;alert(foo)&amp;lt;/script&amp;gt;,这在这种情况下没有任何意义。

    在您的情况下,您似乎正在对其进行两次编码。您应该在存储之前删除对其进行编码的代码,并且仅在输出到页面时进行编码(使用&lt;%: %&gt; 标签)。

    【讨论】:

      猜你喜欢
      • 2011-10-20
      • 2010-12-07
      • 1970-01-01
      • 2018-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多