CS.CSRF.VALIDATE
未完成“POST 请求数据访问”的验证
跨网站请求伪造 (CSRF) 预防是一个复杂的问题,目前没有通用的解决方案。可以使用防伪令牌来减少引入 CSRF 漏洞的机会,这些令牌会要求浏览器发送回每个请求的令牌。在 ASP.NET WebForm 应用程序中,可以使用 Microsoft 的 AntiForgery.Validate() 方法或类似的自定义方法来完成 CSRF 验证。
CS.CSRF.VALIDATE 检查器会标记在属性的返回值(例如 MyTextbox.Text 或 Request.Form["id"])未首先由 AntiForgery.Validate() 方法验证的情况下使用这些返回值的实例。
漏洞与风险
跨网站请求伪造(也称为 XSRF 或 CSRF)是针对 Web 托管应用程序的一种攻击,因此恶意 Web 应用程序可能会影响客户端浏览器与信任该浏览器的 Web 应用程序之间的交互。如果 Web 服务器的设计是为了接收来自客户端的请求,同时又没有任何机制验证请求是否为有意发送,那么攻击者可能会欺骗客户端,使之向 Web 服务器发出非本意的请求,而该请求将被视为真实请求。此操作可以通过 URL、图像加载、XMLHttpRequest 等完成,可能会导致数据暴露或意外的代码执行。这种形式的攻击也被称为一键攻击或会话劫持,因为此类攻击利用的是用户之前经过身份验证的会话。
漏洞代码示例
复制
using System;
using System.Web.UI;
namespace CSRF_checker
{
public partial class _Default : Page
{
protected void Submit_Click(object sender, EventArgs e)
{
var txt = MyTextbox.Text; // CS.CSRF.VALIDATE
}
}
}
在此示例中,Klocwork 在第 10 行报告了缺陷,因为代码未对输入值进行验证。
修正代码示例
复制
using System;
using System.Web.Helpers;
using System.Web.UI;
namespace CSRF_checker
{
public partial class _Default : Page
{
protected void Submit_Click(object sender, EventArgs e)
{
AntiForgery.Validate();
var txt = MyTextbox.Text; // no CS.CSRF.VALIDATE
}
}
}
在此修正代码示例中,代码使用 AntiForgery.Validate 方法对输入方法进行验证,因此 Klocwork 不报告缺陷。