CS.CSRF.ATTR.POST

未设置属性 ViewStateUserKey

跨网站请求伪造 (CSRF) 预防是一个复杂的问题,目前没有通用的解决方案。可以使用防伪令牌来减少引入 CSRF 漏洞的机会,这些令牌会要求浏览器发送回每个请求的令牌。对于从 Microsoft.AspNetCore.Mvc.Controller 派生出的类,这些防伪令牌可以是 AutoValidateAntiForgeryToken。对于方法而言,这些防伪令牌可以是 ValidateAntiForgeryToken 或 IgnoreAntiForgeryToken。如果未使用这些令牌中的任何一个,并且存在 POST 方法,则 CS.CSRF.ATTR.POST 检查器会报告缺陷。(POST 方法是指具有以下属性之一的方法:[HttpPost]、[HttpDelete]、[AcceptVerbs("POST")] 或 [AcceptVerbs("DELETE")])。

漏洞与风险

跨网站请求伪造(也称为 XSRF 或 CSRF)是针对 Web 托管应用程序的一种攻击,因此恶意 Web 应用程序可能会影响客户端浏览器与信任该浏览器的 Web 应用程序之间的交互。如果 Web 服务器的设计是为了接收来自客户端的请求,同时又没有任何机制验证请求是否为有意发送,那么攻击者可能会欺骗客户端,使之向 Web 服务器发出非本意的请求,而该请求将被视为真实请求。此操作可以通过 URL、图像加载、XMLHttpRequest 等完成,可能会导致数据暴露或意外的代码执行。这种形式的攻击也被称为一键攻击会话劫持,因为此类攻击利用的是用户之前经过身份验证的会话。

缓解与预防

防御 CSRF 攻击最常见的方法是使用同步器令牌模式 (STP)。用户请求包含表单数据的页面时,系统会使用 STP:

  1. 服务器会向客户端发送与当前用户标识相关联的令牌。
  2. 然后,客户端将令牌发送回服务器进行验证。
  3. 如果服务器接收到的令牌与经过身份验证的用户标识不匹配,则请求将被拒绝。

在 ASP.NET Core 中,此操作可以使用下列防伪令牌属性来完成:

  • ValidateAntiForgeryToken
  • AutoValidateAntiforgeryToken
  • IgnoreAntiforgeryToken

漏洞代码示例

复制
   using Microsoft.AspNetCore.Mvc;
    
   namespace Example.Controllers
   {
       public class ExampleController : Controller
       {
           [HttpPost]
           public IActionResult Test1(string name, int numTimes = 1) //@ CS.CSRF.ATTR.POST
           {
              string txt1 = Request.Form["Text1"];
              ViewData["Message"] = txt1;
              return View();
          }
      }
  }

在此代码中,类 ExampleController 是从类 Microsoft.AspNetCore.Mvc.Controller 中派生出来的,而且类 ExampleController 不包含属性 [AutoValidateAntiForgeryToken]。Test1 方法是在类 ExampleController 中进行定义,而且 Test1 方法既不包含 [ValidateAntiForgeryToken] 属性,也不包含 [IgnoreAntiForgeryToken] 属性。此外,Test1 方法具有 [HttpPost] 属性。Klocwork 在第 8 行将此漏洞报告为 CS.CSRF.ATTR.POST 缺陷。

修正代码示例

复制
   using Microsoft.AspNetCore.Mvc;
    
   namespace Example.Controllers
   {
       public class ExampleController : Controller
       {
           [ValidateAntiForgeryToken] // Adding this anti-forgery token fixes the issue
           [HttpPost]
           public IActionResult Test1(string name, int numTimes = 1)
          {
              string txt1 = Request.Form["Text1"];
              ViewData["Message"] = txt1;
              return View();
          }
      }
  }

在此修正代码示例中,类 ExampleController 在第 7 行使用了 [AutoValidateAntiForgeryToken] 属性,这会启用 ASP.NET 内置的 CSRF 保护。

安全培训

应用程序安全培训材料由 Secure Code Warrior 提供。