我创建了一个在 .NET 4.7.2 上运行的简单 .NET Web 表单应用程序。
此应用程序有一个文本框、一个提交按钮和一个标签。当您单击提交按钮时,应用程序会显示文本框内容。
为了使此应用程序容易受到跨站点脚本攻击,我在其 web.config 中禁用了请求验证 (validateRequest=false)。这允许我在文本字段中输入值:XSS 并提交。
单击“提交”后,我会看到弹出窗口
为了防止 XSS 攻击,我去获取了 AntiXss 库的 NUGet 包,并按照 Microsoft AntiXss document 的说明在我的 web.config 中引用它.
但是,在我对代码中的值进行显式编码之前,没有任何编码,我的网络应用程序仍然容易受到 XSS 攻击。
protected void Button1_Click(object sender, EventArgs e)
{
//Label1.Text = TextBox1.Text;
Label1.Text = AntiXssEncoder.HtmlEncode(TextBox1.Text,true);
}
有了使用 AntiXss 库编码的值,应用程序现在显示该值而不是执行该脚本并创建弹出窗口。
所以我有三个问题:
- web.config 是做什么的 encoderType="System.Web.Security.AntiXss.AntiXssEncoder"真的可以 因为它不会改变我的测试结果,无论我把它放进去还是 从我的 web.config 中删除它。根据Micrsoft document ,这会设置 HTML 和 URL 编码任务的默认处理程序。
- 如果我必须对每个文本字段进行编码以防止 XSS 攻击,是否有一种站点范围的方法来对其所有字段进行编码?似乎没有 就像具有数百个页面的站点(不是 MVC)的实用解决方案 大量的输入字段遍布各处,不得不一个一个地进行 HTMLEncode。
- 除了显示之外,validateRequest 如何与 XSS 预防一起使用 标准.NET 检测危险请求页面?我可以捕获它吗 异常并在我的页面上显示错误消息而不是显示 默认错误页面如下所示。
最佳答案
好的,首先,从 .Net 4.5 开始,(大部分)AntiXSS 库是框架本身的一部分,它位于 System.Web.Security.AntiXss
中。 ,你不需要单独提供dll。
默认情况下,当使用 @
从 Razor 写入时,框架 html 对输出进行编码, 或来自 asp.net 与 <%:
(而不是 <%=
)。这是 html 编码,.Net 默认使用它以前的基于黑名单的方法执行此操作,该方法有一个要编码的字符列表(例如 <
等等),其余的则不用理会。这对于许多用例来说是可以的,但是使用 encoderType="System.Web.Security.AntiXss.AntiXssEncoder"
切换到 AntiXss启用基于白名单的编码器,这意味着它有一个“无害”字符列表,如字母和数字,并对其他所有内容进行编码,这使其在更多场景中更加安全。
不过请注意一些事情。
- 框架中包含的 AntiXSS 不支持 AntiXSS 库中先前存在的 html 清理功能。你通常不需要它,它的用例是当你故意有 html 用户输入时,你也想将其显示为 html(例如 web ui 上的富文本编辑器),即使这样 AntiXss 中的方法也是就此目的而言,它不是很健壮和安全,我想这就是它被排除在外的原因。
- 不同的上下文需要不同的编码。在 html 上下文中(在 html 标签之间)只使用
@myVar
在 Razor 或<%: myVar %>
在 asp 中很好,并且将被正确编码。它对 html 属性也基本没问题,但在属性中你可能想使用特定的属性编码方法AntiXssEncoder.HtmlAttributeEncode
.对于 Javascript(在脚本标签中,或在像on*
这样的事件属性中),你需要JavascriptEncode
,甚至只有在带引号的字符串中使用它才是安全的(这就是为什么默认情况下它会添加引号)。 - 请求验证一般不会阻止 xss。它确实阻止了一些基本的攻击向量,但请求验证未触及许多攻击向量,您必须手动处理这些向量(尤其是但不限于与 javascript 相关的向量)。
所以简而言之,没有针对 XSS 的 Elixir 。你不能只在一个地方修复它然后忘记它,如果可能的话,框架可能已经这样做了。您需要在用户输入进入页面的每个地方应用正确的编码。唯一的帮助是,如果你使用正确的输出方法(@
和 <%:
),基本的 html 编码会自动应用,但如上所述,这不适用于 javascript 和某些其他场景(例如编写用户在链接中提供的 url 可能会导致用户能够提供 javascript:alert(1)
- 没有编码会删除它,这很讨厌)。
据此,回答你的明确问题:
- 标准编码输出标签(
@
和<%:
)应用基本的 html 编码。这是基于较旧的标准黑名单还是基于更安全的白名单取决于您是否选择框架中已有的 AntiXss 编码器。 - 不,但如果您使用正确的标签,会有一些帮助。但总的来说,您必须检查每一个变量输出。
- validaterequest 所做的只是在任何用户输入(url 变量或表单字段,但不包括 cookie 值和请求 header ,它们也可能成为攻击向量)中查找紧跟字母的小于字符。你不应该太依赖它。不幸的是,我不知道如何显示自定义错误页面(自从我使用 .Net 以来已经有一段时间了),但我很确定这是可能的。 :)
关于c# - .NET Framework 4.7 Web 应用程序中的 AntiXSS - 如何应用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65707334/