ASP.NET MVC XSS 输入字段剥离 HTML/Scripts 或清理

ASP.NET MVC XSS Input Field strip HTML/Scripts or Sanitize

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

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

Input Test <b>abc</b>

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

谢谢。

对输出进行清理,而不是对输入进行清理。

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

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

&lt;script&gt;alert(foo)&lt;/script&gt;

所以

<script>alert(foo)</script>

在您的页面中显示执行。

这样,假设您需要输出到文本文件,那么您不会将 &lt;script&gt;alert(foo)&lt;/script&gt; 打印到页面,而不是 <script>alert(foo)</script>,这在此上下文中没有任何意义。

在您的情况下,您似乎对它进行了两次编码。您应该在存储之前删除对其进行编码的代码,并且仅在输出到页面时进行编码(使用 <%: %> 标记)。

当你为你正在处理的应用程序建立威胁模型或构建威胁概况时,它会在你正在与之交互和通信的系统(应用程序、网页)上变得清晰。你会知道你从哪里接收输入,你会知道你输出的地方。您可以决定是否

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

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

But the best practice is to implement security in depth, in multiple layers. Ideally, you should be doing input sanitization and output encoding as well. Because you may never know that if you do not do input sanitization, your malicious script in the database may get reflected in some other application that you feed your data too.

说了这么多,在你的情况下,我认为你想在输出中看到的不是 Input Test &lt;b&gt;abc&lt;/b&gt; 你想看到的 <b>abc</b>. 当你查看响应时(html 源)那么你应该有 Input Test &lt;b&gt;abc&lt;/b&gt; 将在浏览器中显示为 abc.

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

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