分享方式:


CA3147:使用 ValidateAntiForgeryToken 標示動詞處理常式

屬性
規則識別碼 CA3147
標題 使用 ValidateAntiForgeryToken 標示動詞處理常式
類別 安全性
修正程式是中斷或非中斷 不中斷
預設在 .NET 8 中啟用 No

原因

ASP.NET MVC 控制器動作方法未標示 為 ValidateAntiForgeryTokenAttribute,或指定 HTTP 動詞的屬性,例如 HttpGetAttributeAcceptVerbsAttribute

檔案描述

設計 ASP.NET MVC 控制器時,請注意跨網站要求偽造攻擊。 跨網站要求偽造攻擊可以將來自已驗證用戶的惡意要求傳送至您的 ASP.NET MVC 控制器。 如需詳細資訊,請參閱 ASP.NET MVC 和網頁中的 XSRF/CSRF 預防。

此規則會檢查 ASP.NET MVC 控制器動作方法:

如何修正違規

  • 針對 ASP.NET 處理 HTTP GET 要求且沒有潛在有害副作用的 MVC 控制器動作,請將 HttpGetAttribute 新增至方法。

    如果您有處理 HTTP GET 要求的 ASP.NET MVC 控制器動作,而且有潛在的有害副作用,例如修改敏感數據,則您的應用程式容易受到跨網站要求偽造攻擊的影響。 您必須重新設計應用程式,讓只有 HTTP POST、PUT 或 DELETE 要求執行敏感性作業。

  • 針對處理 HTTP POST、PUT 或 DELETE 要求的 ASP.NET MVC 控制器動作,請新增 ValidateAntiForgeryTokenAttribute 和指定允許 HTTP 動詞的屬性(AcceptVerbsAttribute、HttpPostAttributeHttpPutAttributeHttpDeleteAttribute)。 此外,您必須從MVC檢視或Razor網頁呼叫 HtmlHelper.AntiForgeryToken() 方法。 如需範例,請參閱 檢查編輯方法和編輯檢視

隱藏警告的時機

如果下列狀況,可以放心地隱藏此規則的警告:

  • ASP.NET MVC 控制器動作沒有有害的副作用。
  • 應用程式會以不同的方式驗證反forgery 令牌。

隱藏警告

如果您只想要隱藏單一違規,請將預處理器指示詞新增至原始程式檔以停用,然後重新啟用規則。

#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;
        }
    }
}