CA3147:ValidateAntiForgeryToken で動詞ハンドラーをマークします

プロパティ
ルール ID CA3147
Title ValidateAntiForgeryToken で動詞ハンドラーをマークします
[カテゴリ] Security
修正が中断か中断なしであるか なし
.NET 8 では既定で有効 いいえ

原因

ASP.NET MVC コントローラーのアクション メソッドが ValidateAntiForgeryTokenAttribute、または HttpGetAttributeAcceptVerbsAttribute などの 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 動詞 (AcceptVerbsAttributehttppostattributeValidateAntiForgeryTokenAttribute、およびを指定する属性と属性を追加します。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;
        }
    }
}