CA3147:ValidateAntiForgeryToken で動詞ハンドラーをマークします
プロパティ | 値 |
---|---|
ルール ID | CA3147 |
Title | ValidateAntiForgeryToken で動詞ハンドラーをマークします |
[カテゴリ] | Security |
修正が中断か中断なしであるか | なし |
.NET 8 では既定で有効 | いいえ |
原因
ASP.NET MVC コントローラーのアクション メソッドが ValidateAntiForgeryTokenAttribute、または HttpGetAttribute や AcceptVerbsAttribute などの HTTP 動詞を指定する属性によってマークされていません。
規則の説明
ASP.NET MVC コントローラーを設計するときには、クロスサイト リクエスト フォージェリ攻撃に注意してください。 クロスサイト リクエスト フォージェリ攻撃では、認証されたユーザーから ASP.NET MVC コントローラーに悪意のある要求が送信される可能性があります。 詳細については、ASP.NET MVC と Web ページの XSRF/CSRF 防止に関するページを参照してください。
この規則では、ASP.NET MVC コントローラーのアクション メソッドが次のいずれかであることを確認します。
ValidateAntiforgeryTokenAttribute を持っていて、許可される HTTP 動詞 (HTTP GET を含まない) が指定されている。
許可される動詞として HTTP GET が指定されている。
違反の修正方法
HTTP GET 要求を処理し、有害な副作用の可能性がない ASP.NET MVC コントローラーのアクションについては、メソッドに HttpGetAttribute を追加します。
HTTP GET 要求を処理し、機密性の高いデータの変更など、有害な副作用の可能性がある ASP.NET MVC コントローラーのアクションがある場合、アプリケーションはクロスサイト リクエスト フォージェリに対して脆弱になります。 HTTP POST、PUT、または DELETE 要求のみが機密性の高い操作を実行するように、アプリケーションを再設計する必要があります。
HTTP POST、PUT、DELETE の各要求を処理する ASP.NET MVC コントローラーアクションの場合は、許可されている HTTP 動詞 (AcceptVerbsAttribute、 httppostattributeValidateAntiForgeryTokenAttribute、およびを指定する属性と属性を追加します。HttpPutAttributeまたはhttpputattribute)。 さらに、MVC ビューまたは Razor Web ページから HtmlHelper.AntiForgeryToken() メソッドを呼び出す必要があります。 例については、edit メソッドと edit ビューの確認に関するページを参照してください。
どのようなときに警告を抑制するか
次の場合は、このルールの警告を抑制できます。
- ASP.NET MVC コントローラーのアクションに、有害な副作用がない。
- アプリケーションで、別の方法で偽造防止トークンを検証する。
警告を抑制する
単一の違反を抑制するだけの場合は、ソース ファイルにプリプロセッサ ディレクティブを追加して無効にしてから、規則をもう一度有効にします。
#pragma warning disable CA3147
// The code that's violating the rule is on this line.
#pragma warning restore CA3147
ファイル、フォルダー、またはプロジェクトの規則を無効にするには、構成ファイルでその重要度を none
に設定します。
[*.{cs,vb}]
dotnet_diagnostic.CA3147.severity = none
詳細については、「コード分析の警告を抑制する方法」を参照してください。
ValidateAntiForgeryToken 属性の例
違反:
namespace TestNamespace
{
using System.Web.Mvc;
public class TestController : Controller
{
public ActionResult TransferMoney(string toAccount, string amount)
{
// You don't want an attacker to specify to who and how much money to transfer.
return null;
}
}
}
解決方法:
using System;
using System.Xml;
namespace TestNamespace
{
using System.Web.Mvc;
public class TestController : Controller
{
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult TransferMoney(string toAccount, string amount)
{
return null;
}
}
}
HttpGet 属性の例
違反:
namespace TestNamespace
{
using System.Web.Mvc;
public class TestController : Controller
{
public ActionResult Help(int topicId)
{
// This Help method is an example of a read-only operation with no harmful side effects.
return null;
}
}
}
解決方法:
namespace TestNamespace
{
using System.Web.Mvc;
public class TestController : Controller
{
[HttpGet]
public ActionResult Help(int topicId)
{
return null;
}
}
}
.NET