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 は、ユーザーが書式データを伴うページを要求するときに使用されます。
- サーバーは、現在のユーザーの ID に関連付けられたトークンをクライアントに送信します。
- クライアントは、検証のためにトークンをサーバーに送り返します。
- サーバーが認証されたユーザーの 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 保護を有効にします。
外部参考資料
セキュリティトレーニング
Secure Code Warrior が提供しているアプリケーションセキュリティトレーニング教材。