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:

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

在 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 保护。

安全培训

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