【问题标题】: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】:
当您为正在处理的应用程序建立威胁模型或构建威胁配置文件时,您正在与之交互和通信的系统(应用程序、网页)上会一目了然。您将了解您从中接收输入的地方,您将了解您正在输出的地方。你可以决定是否
- 您想清理输入并将其存储在数据库中
- 或者只是在数据库中存储恶意输入(记住即使
<script>script('foo')</script>在数据库中,当它反映在页面上时仍然是恶意的)在数据库中,然后阻止它在浏览器中显示时执行或网络应用程序。
给出一个结论性的答案并不是很容易给出一个结论性的答案,即您应该在将输入字符串放入数据库之前对其进行清理(例如,如果用户输入字符串
Alex <script>window.location='http://evil.com';</script> 那么你应该只存储 Alex 并从输入的字符串中清除恶意输入,然后将其存储在数据库中)或者不要担心输入净化,取决于输出编码。
但最佳做法是深入实施安全性,在多个
层。理想情况下,您应该进行输入清理和输出
编码也是如此。因为你可能永远不知道如果你不这样做
输入清理,您在数据库中的恶意脚本可能会得到
反映在您也提供数据的其他一些应用程序中。
说了这么多故事,在你的情况下,我认为你想在输出中看到的不是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 视图引擎,那么您放在脚本块 <%: %> 中的任何内容都将被输出编码。
我认为您关于最佳实践的问题已得到解答。如果您想了解其他任何内容(与此问题相关),请评论编辑问题。
【解决方案2】:
清理输出,而不是输入。
将&lt;script&gt;alert(foo)&lt;/script&gt; 存储在您的数据库中是安全的——在那里没有任何意义。
只有当您将其输出到 HTML 页面时,您才需要对特殊字符进行编码。即你需要输出
<script>alert(foo)</script>
所以
<script>alert(foo)</script>
在您的页面中显示,未执行。
这样,如果您需要输出到一个文本文件,那么您就不会将&lt;script&gt;alert(foo)&lt;/script&gt; 打印到页面而不是&lt;script&gt;alert(foo)&lt;/script&gt;,这在这种情况下没有任何意义。
在您的情况下,您似乎正在对其进行两次编码。您应该在存储之前删除对其进行编码的代码,并且仅在输出到页面时进行编码(使用<%: %> 标签)。