Asp.net mvc 4 ASP.NET MVC XSS输入字段剥离HTML/脚本或清理

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

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

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

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