CS.CSRF.ATTR.NOATTR
未设置属性 ViewStateUserKey
跨网站请求伪造 (CSRF) 预防是一个复杂的问题,目前没有通用的解决方案。可以使用防伪令牌来减少引入 CSRF 漏洞的机会,这些令牌会要求浏览器发送回每个请求的令牌。对于从 Microsoft.AspNetCore.Mvc.Controller 派生出的类,这些防伪令牌可以是 AutoValidateAntiForgeryToken。 对于方法而言,这些防伪令牌可以是 ValidateAntiForgeryToken 或 IgnoreAntiForgeryToken。如果未使用这些令牌中的任何一个,则 CS.CSRF.ATTR.NOATTR 检查器会报告缺陷。
漏洞与风险
跨网站请求伪造(也称为 XSRF 或 CSRF)是针对 Web 托管应用程序的一种攻击,因此恶意 Web 应用程序可能会影响客户端浏览器与信任该浏览器的 Web 应用程序之间的交互。如果 Web 服务器的设计是为了接收来自客户端的请求,同时又没有任何机制验证请求是否为有意发送,那么攻击者可能会欺骗客户端,使之向 Web 服务器发出非本意的请求,而该请求将被视为真实请求。此操作可以通过 URL、图像加载、XMLHttpRequest 等完成,可能会导致数据暴露或意外的代码执行。这种形式的攻击也被称为一键攻击或会话劫持,因为此类攻击利用的是用户之前经过身份验证的会话。
缓解与预防
防御 CSRF 攻击最常见的方法是使用同步器令牌模式 (STP)。用户请求包含表单数据的页面时,系统会使用 STP:
- 服务器会向客户端发送与当前用户标识相关联的令牌。
- 然后,客户端将令牌发送回服务器进行验证。
- 如果服务器接收到的令牌与经过身份验证的用户标识不匹配,则请求将被拒绝。
在 ASP.NET Core 中,此操作可以使用下列防伪令牌属性来完成:
- ValidateAntiForgeryToken
- AutoValidateAntiforgeryToken
- IgnoreAntiforgeryToken
漏洞代码示例
using Microsoft.AspNetCore.Mvc;
namespace Example.Controllers
{
public class ExampleController : Controller
{
public IActionResult Test1()
{
string txt1 = Request.Form["Text1"];
ViewData["Message"] = txt1;
return View();
}
}
}
在此示例中,公共类 ExampleController 是从类 Microsoft.AspNetCore.Mvc.Controller 中派生出来的。类 ExampleController 及其方法未使用任何防伪令牌属性。Klocwork 将此漏洞报告为 CS.CSRF.ATTR.NOATTR 缺陷。
修正代码示例
using Microsoft.AspNetCore.Mvc;
namespace Example.Controllers
{
[AutoValidateAntiForgeryToken]
public class ExampleController : Controller
{
public IActionResult Test1()
{
string txt1 = Request.Form["Text1"];
ViewData["Message"] = txt1;
return View();
}
}
}
在此修正代码示例中,类 ExampleController 是从类 Microsoft.AspNetCore.Mvc.Controller 中派生出来的,类 ExampleController 使用 [AutoValidateAntiForgeryToken] 属性,这将会启用 ASP.NET 内置的 CSRF 保护。