CA3147:使用 ValidateAntiForgeryToken 標示動詞處理常式
屬性 | 值 |
---|---|
規則識別碼 | CA3147 |
標題 | 使用 ValidateAntiForgeryToken 標示動詞處理常式 |
類別 | 安全性 |
修正程式是中斷或非中斷 | 不中斷 |
預設在 .NET 8 中啟用 | No |
原因
ASP.NET MVC 控制器動作方法未標示 為 ValidateAntiForgeryTokenAttribute,或指定 HTTP 動詞的屬性,例如 HttpGetAttribute 或 AcceptVerbsAttribute。
檔案描述
設計 ASP.NET MVC 控制器時,請注意跨網站要求偽造攻擊。 跨網站要求偽造攻擊可以將來自已驗證用戶的惡意要求傳送至您的 ASP.NET MVC 控制器。 如需詳細資訊,請參閱 ASP.NET MVC 和網頁中的 XSRF/CSRF 預防。
此規則會檢查 ASP.NET MVC 控制器動作方法:
具有 ValidateAntiforgeryTokenAttribute 並指定允許的 HTTP 動詞,不包括 HTTP GET。
將 HTTP GET 指定為允許的動詞。
如何修正違規
針對 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、HttpPostAttribute、HttpPutAttribute 或 HttpDeleteAttribute)。 此外,您必須從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;
}
}
}