CA5391: ASP.NET Core MVC コントローラーで偽造防止トークンを使用します
プロパティ | 値 |
---|---|
ルール ID | CA5391 |
Title | ASP.NET Core MVC コントローラーで偽造防止トークンを使用します |
[カテゴリ] | Security |
修正が中断か中断なしであるか | なし |
.NET 9 では既定で有効 | いいえ |
原因
結果として操作が変更されるアクションに、偽造防止属性がありません。 または、想定される偽造防止トークン関数を呼び出さずに、グローバルな偽造防止トークン フィルターを使用しています。
規則の説明
偽造防止トークンを検証せずに POST
、PUT
、PATCH
または DELETE
要求を処理すると、クロスサイト リクエスト フォージェリ攻撃に対して脆弱になる可能性があります。 クロスサイト リクエスト フォージェリ攻撃では、認証されたユーザーから ASP.NET Core MVC コントローラーに悪意のある要求が送信される可能性があります。
違反の修正方法
- 有効な偽造防止トークン属性で変更アクションをマークします。
- Microsoft.AspNetCore.Mvc.ValidateAntiForgeryTokenAttribute=
- 名前が
%Validate%Anti_orgery%Attribute
などの属性。
- Microsoft.AspNetCore.Mvc.Filters.FilterCollection.Add を使用して、有効な偽造トークン属性をグローバル フィルターに追加します。
- Microsoft.AspNetCore.Antiforgery.IAntiforgery インターフェイスを実装する任意のクラスで
Validate
を呼び出すカスタムまたは Mvc で提供される偽造防止フィルター クラスを追加します。
警告を抑制するタイミング
偽造防止トークン属性を使用する以外のソリューションが CSRF 脆弱性を軽減するために採用されている場合は、この規則を抑制しても問題ありません。 詳細については、「ASP.NET Core でのクロスサイト リクエスト フォージェリ (XSRF/CSRF) 攻撃の防止」を参照してください。
警告を抑制する
単一の違反を抑制するだけの場合は、ソース ファイルにプリプロセッサ ディレクティブを追加して無効にしてから、規則をもう一度有効にします。
#pragma warning disable CA5391
// The code that's violating the rule is on this line.
#pragma warning restore CA5391
ファイル、フォルダー、またはプロジェクトの規則を無効にするには、構成ファイルでその重要度を none
に設定します。
[*.{cs,vb}]
dotnet_diagnostic.CA5391.severity = none
詳細については、「コード分析の警告を抑制する方法」を参照してください。
分析するコードを構成する
コードベースで Microsoft.AspNetCore.Mvc.Controller の派生クラスにのみ規則を適用するかどうかを構成できます。 たとえば、ControllerBase の派生型内のコードで規則を実行しないように指定するには、プロジェクトの .editorconfig ファイルに次のキーと値のペアを追加します。
dotnet_code_quality.CA5391.exclude_aspnet_core_mvc_controllerbase = true
疑似コードの例
偽造防止トークン属性違反がない
using Microsoft.AspNetCore.Mvc;
class ExampleController : Controller
{
[HttpDelete]
public IActionResult ExampleAction (string actionName)
{
return null;
}
[ValidateAntiForgeryToken]
[HttpDelete]
public IActionResult AnotherAction (string actionName)
{
return null;
}
}
有効なグローバル偽造防止フィルターがない
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
class ExampleController : Controller
{
[ValidateAntiForgeryToken]
[HttpDelete]
public IActionResult AnotherAction (string actionName)
{
return null;
}
[HttpDelete]
public IActionResult ExampleAction (string actionName)
{
return null;
}
}
class FilterClass : IAsyncAuthorizationFilter
{
public Task OnAuthorizationAsync (AuthorizationFilterContext context)
{
return null;
}
}
class BlahClass
{
public static void BlahMethod ()
{
FilterCollection filterCollection = new FilterCollection ();
filterCollection.Add(typeof(FilterClass));
}
}
偽造防止トークン属性ソリューションでマークされている
using Microsoft.AspNetCore.Mvc;
class ExampleController : Controller
{
[ValidateAntiForgeryToken]
[HttpDelete]
public IActionResult ExampleAction ()
{
return null;
}
[ValidateAntiForgeryToken]
[HttpDelete]
public IActionResult AnotherAction ()
{
return null;
}
}
有効なグローバル偽造防止フィルターを使用する
using System.Threading.Tasks;
using Microsoft.AspNetCore.Antiforgery;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
class ExampleController : Controller
{
[ValidateAntiForgeryToken]
[HttpDelete]
public IActionResult AnotherAction()
{
return null;
}
[HttpDelete]
public IActionResult ExampleAction()
{
return null;
}
}
class FilterClass : IAsyncAuthorizationFilter
{
private readonly IAntiforgery antiforgery;
public FilterClass(IAntiforgery antiforgery)
{
this.antiforgery = antiforgery;
}
public Task OnAuthorizationAsync(AuthorizationFilterContext context)
{
return antiforgery.ValidateRequestAsync(context.HttpContext);
}
}
class BlahClass
{
public static void BlahMethod()
{
FilterCollection filterCollection = new FilterCollection();
filterCollection.Add(typeof(FilterClass));
}
}
.NET