CS.CSRF.ATTR.POST

プロパティ 'ViewStateUserKey' は設定されません

クロスサイトリクエストフォージェリ (CSRF) の防止は、普遍的な解決策がない複雑な問題です。CSRF の脆弱性が発生する可能性を減らす 1 つの方法は、要求ごとにトークンを返すようにブラウザに要求する、偽造防止トークンを使用することです。'Microsoft.AspNetCore.Mvc.Controller' から派生したクラスの場合、これらの偽造防止トークンは 'AutoValidateAntiForgeryToken' にすることができます。メソッドの場合、これらの偽造防止トークンは 'ValidateAntiForgeryToken' または 'IgnoreAntiForgeryToken' のいずれかにすることができます。CS.CSRF.ATTR.POST チェッカーは、これらのどのトークンも使用されておらず、POST メソッド (つまり、次のいずれかの属性を伴うメソッド) が存在する場合に、欠陥を報告します。[HttpPost]、[HttpDelete]、[AcceptVerbs("POST")]、または [AcceptVerbs("DELETE")])。

脆弱性とリスク

クロスサイトリクエストフォージェリ (XSRF または CSRF とも呼ばれる) は、Web でホストされているアプリに対する攻撃であり、悪意のある Web アプリが、クライアントブラウザとそのブラウザを信頼する Web アプリとの間の相互作用に影響を与える可能性があります。Web サーバーが、意図的に送信されたことを確認するメカニズムなしに、クライアントからの要求を受信するように設計されている場合、攻撃者はクライアントをだまして Web サーバーに意図しない要求を行わせ、信頼できる要求として処理させてしまう可能性があります。これは、URL、画像のロード、XMLHttpRequest などを通じて実行することができ、データの公開や意図しないコードの実行を引き起こす可能性があります。この攻撃はユーザーの以前に認証されたセッションを利用するため、こうした悪用の形式は、ワンクリック攻撃またはセッションライディングとも呼ばれます。

軽減と防止

CSRF 攻撃から防御するための最も一般的なアプローチは、シンクロナイザートークンパターン (STP) を使用することです。STP は、ユーザーが書式データを伴うページを要求するときに使用されます。

  1. サーバーは、現在のユーザーの ID に関連付けられたトークンをクライアントに送信します。
  2. クライアントは、検証のためにトークンをサーバーに送り返します。
  3. サーバーが認証されたユーザーの ID と一致しないトークンを受信した場合、その要求は拒否されます。

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();
          }
      }
  }

この修正された例では、7 行目でクラス 'ExampleController' は [AutoValidateAntiForgeryToken] 属性を使用しており、ASP.NET の組み込み CSRF 保護を有効にします。