.NET Framework 4.7 Web应用程序中的AntiXSS-如何应用它

dnph8jn4  于 2023-05-19  发布在  .NET
关注(0)|答案(1)|浏览(296)

我创建了一个简单的.NET Web表单应用程序,它运行在.NET 4.7.2上。
这个应用程序有一个文本框、一个提交按钮和一个标签。当您单击提交按钮时,应用程序将显示文本框内容。

为了使这个应用程序容易受到跨站脚本的攻击,我在它的web. config中禁用了请求验证(validateRequest=false)。这允许我在文本字段中键入值:XSS并提交。

单击“提交”后,我看到弹出窗口

为了防止XSS攻击,我去拿了AntiXss库的NUGet包,并按照Microsoft AntiXss document的指示在我的web.config中引用它。

然而,没有任何编码,我的Web应用程序仍然容易受到XSS攻击,直到我在代码中显式编码该值。

protected void Button1_Click(object sender, EventArgs e)
        {
            //Label1.Text = TextBox1.Text;
            Label1.Text = AntiXssEncoder.HtmlEncode(TextBox1.Text,true);

        }

使用AntiXss库对值进行编码后,应用程序现在显示该值,而不是执行该脚本并创建弹出窗口。

所以我有三个问题:

  1. web.config encoderType=“System.Web.Security.AntiXss.AntiXssEncoder”实际上做了什么,因为它不会改变我的测试结果,无论我把它放在我的web. config中还是从我的web. config中删除。根据Micrsoft document,这将为HTML和URL编码任务设置默认处理程序。
    1.如果我必须对每个文本字段进行编码以防止XSS攻击,是否有一种站点范围的方法来对所有字段进行编码?对于一个有着数百个页面的站点(不是MVC)来说,这似乎不是一个实用的解决方案,这些页面有着大量的输入字段,分布在各个地方,并且必须一个接一个地进行HTMLEncode。
    1.除了显示标准的.NET检测到危险的请求页面之外,validateRequest如何与XSS预防一起工作?我可以捕捉它作为异常,并显示在我的页面上的错误消息,而不是显示默认的错误页面,如下图所示。
pgvzfuti

pgvzfuti1#

首先,从.Net 4.5开始,(大部分)AntiXSS库是框架本身的一部分,它在System.Web.Security.AntiXss中,您不需要单独提供dll。
默认情况下,框架html在从Razor使用@或从asp.net使用<%:(而不是<%=)编写时对输出进行编码。这是html编码,.Net默认情况下使用它以前的基于黑名单的方法来完成,该方法有一个要编码的字符列表(例如。<等等),剩下的就不提了。这对于许多用例来说是可以的,但是切换到具有encoderType="System.Web.Security.AntiXss.AntiXssEncoder"的AntiXss可以启用基于白名单的编码器,这意味着它有一个“无害”字符的列表,如字母和数字,并编码 * 其他所有 *,这使得它在更多的场景中更安全。
但要注意几点。

  • 包含在框架中的AntiXSS不支持以前存在于AntiXSS库中的html清理功能。你通常不需要这样做,使用情况是当你故意有html用户输入,你也想显示为html(例如在web ui上的富文本编辑器),即使这样,在AntiXss的方法不是很健壮和安全的目的,我想这就是为什么它被排除在外。
  • 不同的上下文需要不同的编码。在html上下文中(在html标签之间),只需在Razor中使用@myVar或在asp中使用<%: myVar %>就可以了,并且可以正确编码。对于html属性来说,这也是可以的,但是在属性中,你可能想使用特定的属性编码方法AntiXssEncoder.HtmlAttributeEncode。对于Javascript(在脚本标记中,或者在像on*这样的事件属性中),您需要JavascriptEncode,即使这样也只有在引号字符串中使用时才是安全的(这就是为什么默认情况下它会添加引号)。
  • 请求验证一般不会阻止xss。它确实阻止了一些基本的攻击媒介,但许多都没有被请求验证所触及,你必须手工处理那些(特别是,但不完全是与javascript相关的)。

所以简而言之,没有对付XSS的灵丹妙药。你不能只在一个地方修复它,然后忘记它,如果可能的话,框架可能已经这样做了。您需要在用户输入进入页面的每个地方应用正确的编码。唯一的帮助是如果你使用正确的输出方法(@<%:),则会自动应用基本的html编码,但如上所述,这不适用于javascript和某些其他场景。(例如在链接中写入用户提供的URL将很可能导致用户能够提供javascript:alert(1)-并且没有编码将消除这一点,这只是令人讨厌的)。
在此基础上,回答您明确的问题:
1.标准编码输出标记(@<%:)应用基本的html编码。这是基于旧的标准黑名单还是基于更安全的白名单取决于您是否选择了框架中已经存在的AntiXss编码器。
1.不,但如果你使用正确的标签,会有一些帮助。但一般来说,你必须审查每一个变量输出。

  1. validaterequest所做的一切就是在任何用户输入中(url变量或表单字段,但不包括cookie值和请求头,这些也可能成为攻击载体)寻找一个直接跟在字母后面的小于字符。你真的不应该太依赖它。不幸的是,我不知道如何显示自定义错误页面(我已经有一段时间没有使用.Net了),但我很确定这是可能的。:)

相关问题