繁体   English   中英

AntiXSS in .NET Framework 4.7 web 应用-如何应用

[英]AntiXSS in .NET Framework 4.7 web application - how to apply it

我创建了一个简单的 .NET web 表单应用程序,它在 .NET 4.7.2 上运行。

此应用程序有一个文本框、一个提交按钮和一个 label。当您单击提交按钮时,应用程序会显示文本框内容。

在此处输入图像描述

为了使此应用程序容易受到跨站点脚本攻击,我在其 web.config 中禁用了请求验证 (validateRequest=false)。 这允许我在文本字段中输入值:XSS<img src=x onerror=confirm("HACKED")> 并提交。

在此处输入图像描述

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

在此处输入图像描述

为了防止 XSS 攻击,我去获取了 AntiXss 库的 NUGet package 并按照Microsoft AntiXss 文档中的说明在我的 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 中删除。 根据Micrsoft 文档,这为 HTML 和 URL 编码任务设置了默认处理程序。
  2. 如果我必须对每个文本字段进行编码以防止 XSS 攻击,是否有一种站点范围的方法来对其所有字段进行编码? 对于一个有数百个页面的站点(不是 MVC)来说,它似乎不是一个实用的解决方案,其中有大量的输入字段遍布各处,并且必须一个一个地进行 HTMLEncode。
  3. 除了显示标准 .NET 检测危险请求页面之外,validateRequest 如何与 XSS 预防一起使用? 我可以将其捕获为异常并在我的页面上显示一条错误消息,而不是像下面这样显示默认错误页面吗?

好的,首先,从 .Net 4.5 开始,(大部分)AntiXSS 库是框架本身的一部分,它位于System.Web.Security.AntiXss中,您不需要单独提供 dll。

默认情况下,当使用@从 Razor 写入时,框架 html 编码为 output,或者使用<%: (而不是<%= )从 asp.net 写入。 它所做的是 html 编码,.Net 默认使用它以前的基于黑名单的方法执行此操作,该方法有一个要编码的字符列表(例如<等),并且单独留下 rest。这对许多用例,但是使用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 的灵丹妙药。 你不能只在一个地方修复它然后忘记它,如果可能的话,框架可能已经这样做了。 您需要在用户输入进入页面的每个地方应用正确的编码。 唯一的帮助是,如果您使用正确的 output 方法( @<%: :),将自动应用基本的 html 编码,但如上所述,这不适用于 javascript 和某些其他场景(例如编写用户提供的链接中的 url 可能会导致用户能够提供javascript:alert(1) - 没有编码会删除它,这很讨厌)。

基于此,回答您的明确问题:

  1. 标准编码的 output 标签( @<%: )应用基本的 html 编码。 这是基于较旧的标准黑名单,还是基于更安全的白名单取决于您 select AntiXss 编码器是否已经在框架中。
  2. 不,但是如果您使用正确的标签会有一些帮助。 但总的来说,您必须检查每个变量 output。
  3. 所有 validaterequest 所做的就是在任何用户输入(url 变量或表单字段,但不是例如 cookie 值和请求标头,它们也可能成为攻击向量)中查找紧跟字母的小于字符。 你不应该太依赖它。 不幸的是,我不知道如何显示自定义错误页面(我已经有一段时间没用 .Net 了),但我很确定这是可能的。 :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM