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 不报告缺陷。

安全培训

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