Asp.net mvc 4 ASP.NET MVC XSS输入字段剥离HTML/脚本或清理
我正在使用ASP.NET MVC AntiXssEncoder来阻止重新生成表单上输入字段的XSS 但是,当用户在更新页面上看到以下内容时:Asp.net mvc 4 ASP.NET MVC XSS输入字段剥离HTML/脚本或清理,asp.net-mvc-4,xss,antixsslibrary,Asp.net Mvc 4,Xss,Antixsslibrary,我正在使用ASP.NET MVC AntiXssEncoder来阻止重新生成表单上输入字段的XSS 但是,当用户在更新页面上看到以下内容时: Input Test <b>abc</b> 这种情况下的最佳实践是什么? 1.清理或删除所有HTML和脚本标记 谢谢。对输出进行消毒,而不是对输入进行消毒 将警报(foo)存储在您的数据库中是安全的-这没有任何意义 只有当您将其输出到HTML页面时,才需要对特殊字符进行编码。i、 e您需要输出 &a
Input Test <b>abc</b>
这种情况下的最佳实践是什么?
1.清理或删除所有HTML和脚本标记
谢谢。对输出进行消毒,而不是对输入进行消毒 将
警报(foo)
存储在您的数据库中是安全的-这没有任何意义
只有当您将其输出到HTML页面时,才需要对特殊字符进行编码。i、 e您需要输出
<script>alert(foo)</script>
所以
警报(foo)
显示在页面中,而不是执行
这样,假设如果需要输出到文本文件,则不将scriptalert(foo)/script
打印到页面上,而将alert(foo)
打印到页面上,这在上下文中没有任何意义
在您的情况下,似乎要对其进行两次编码。您应该在存储之前删除对其进行编码的代码,并且只在输出到页面时进行编码(使用
标记)。在输出时进行消毒,而不是在输入时进行消毒
将警报(foo)
存储在您的数据库中是安全的-这没有任何意义
只有当您将其输出到HTML页面时,才需要对特殊字符进行编码。i、 e您需要输出
<script>alert(foo)</script>
所以
警报(foo)
显示在页面中,而不是执行
这样,假设如果需要输出到文本文件,则不将scriptalert(foo)/script
打印到页面上,而将alert(foo)
打印到页面上,这在上下文中没有任何意义
在您的情况下,似乎要对其进行两次编码。您应该在存储之前删除对其进行编码的代码,并且只在输出到页面时进行编码(使用
标记)。当您为正在处理的应用程序建立威胁模型或威胁配置文件时,您与之交互和通信的系统(应用程序、网页)上会清楚显示出来。您将了解接收输入的位置,您将了解输出的位置。你可以决定是否
script('foo')
在数据库中,当它反映在页面上时仍然是恶意的)存储在数据库中,然后防止在浏览器或web应用程序中显示时执行它Alex窗口。位置=http://evil.com“;
然后您应该只存储Alex,并从输入的字符串中清除恶意输入,然后将其存储在数据库中)或者不必担心输入清理,这取决于输出编码
但最佳实践是在多个方面深入实施安全性
层。理想情况下,您应该进行输入清理和输出
编码也是如此。因为如果你不这样做,你可能永远不会知道
输入清理后,数据库中的恶意脚本可能会
反映在一些其他的应用程序中,您也提供了数据
说了所有这些故事之后,在您的情况下,我认为您希望在输出中看到的不是Input Test babc/b
您希望看到abc。
当您查看页面的响应(html源代码)时,您应该看到Input Test babc/b
,它将作为abc显示在浏览器中
但是,如果您在浏览器中看到Input Test babc/b
,那么我认为您的响应(使用fiddler捕获的查看源代码选项)是&;书信电报;百安居酒店;燃气轮机;abc&;lt/百安居酒店;燃气轮机代码>。如果是这种情况,那么您就遇到了双重编码的问题(实际上是双重html输出编码)。如果您使用的是razor视图引擎,那么除非您使用Html.Raw
。。。默认情况下,您输出的每个字符串都将使用Razor视图引擎的@
语法进行输出编码。如果您使用的是aspx视图引擎,那么您在脚本块
中放入的任何内容都将被编码输出
我认为你关于最佳实践的问题已经得到了回答。如果您想知道任何其他信息(与此问题相关),请评论编辑问题。当您为正在处理的应用程序建立威胁模型或构建威胁配置文件时,您与之交互和通信的系统(应用程序、网页)上会清楚地显示出来。您将了解接收输入的位置,您将了解输出的位置。你可以决定是否
您希望清理输入并将其存储在数据库中
或者只是将恶意输入(请记住,即使script('foo')
在数据库中,当它反映在页面上时仍然是恶意的)存储在数据库中,然后防止在浏览器或web应用程序中显示时执行它
在数据库中输入字符串之前(例如,如果用户输入字符串),您不应该给出一个结论性的答案
Alex窗口。位置=http://evil.com“;
然后您应该只存储Alex,并从输入的字符串中清除恶意输入,然后将其存储在数据库中)或者不必担心输入清理,这取决于输出编码
但最佳实践是在多个方面深入实施安全性
层。理想情况下,您应该进行输入清理和输出
编码也是如此。因为如果你不这样做,你可能永远不会知道
输入清理后,数据库中的恶意脚本可能会
反映在一些其他的应用程序中,您也提供了数据
说了这么多,在你的例子中,我认为你想在输出中看到的是,而不是你想看到的输入测试babc/b