CS.CSRF.ATTR.NOATTR

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

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

脆弱性とリスク

クロスサイトリクエストフォージェリ (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
       {
           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 保護を有効にします。