CS.CSRF.VSUK.NOASSIGN

未设置属性 ViewStateUserKey

跨网站请求伪造 (CSRF) 预防是一个复杂的问题,目前没有通用的解决方案。可以使用防伪令牌来减少引入 CSRF 漏洞的机会,这些令牌会要求浏览器发送回每个请求的令牌。在 ASP.NET WebForm 应用程序中,此操作可以通过设置 System.Web.UI.Page 类的 ViewStateUserKey 属性来完成。CS.CSRF.VSUK 系列会在页面初始化期间验证属性 ViewStateUserKey 设置得是否正确(即使用下列方法之一:Page_Init、OnInit 或 OnPreInit)。

CS.CSRF.VSUK.NOASSIGN 检查器会标记在初始化期间似乎不会为 ViewStateUserKey 属性分配值的类。

漏洞与风险

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

漏洞代码示例

复制
   using System;
   using System.Web.UI;
    
   namespace Example
   {
       public partial class Contact : Page     //@ CS.CSRF.VSUK.NOASSIGN
       {
           protected void Page_Load(object sender, EventArgs e)
           {
   
          }
      }
  }

在此示例中,属于 System.Web.UI.Page(即 .aspx 页面后面的代码)类型的类 Contact 不会为 ViewStateUserKey 分配值。这使得网站的用户容易受到 CSRF 攻击。Klocwork 在第 6 行的 Contact 类声明中将此漏洞报告为 CS.CSRF.VSUK.NOASSIGN 缺陷。

修正代码示例

复制
   using System;
   using System.Web.UI;
    
   namespace Example
   {
       public partial class Contact : Page     //@no CS.CSRF.VSUK.NOASSIGN
       {
           protected void Page_Load(object sender, EventArgs e)
           {
   
          }
   
          protected void Page_Init(object sender, EventArgs e)
          {
              ViewStateUserKey = Session.SessionID;
          }
   
      }
  }

在此修正代码示例中,在页面初始化期间为 ViewStateUserKey 分配一个非常数值。这是 Microsoft 推荐的方法,可避免在 ASP.NET WebForms 应用程序中发生 CSRF 攻击。Klocwork 不再报告 CS.CSRF.VSUK.NOASSIGN 缺陷。

安全培训

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