CA3147:使用 ValidateAntiForgeryToken 标记谓词处理程序
属性 | 值 |
---|---|
规则 ID | CA3147 |
标题 | 使用 ValidateAntiForgeryToken 标记谓词处理程序 |
类别 | 安全性 |
修复是中断修复还是非中断修复 | 非中断 |
在 .NET 8 中默认启用 | 否 |
原因
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 指定为允许的谓词。
如何解决冲突
用于处理 HTTP GET 请求且没有潜在有害副作用的 ASP.NET MVC 控制器操作,请向该方法添加 HttpGetAttribute。
如果有 ASP.NET MVC 控制器操作,该操作可处理 HTTP GET 请求,并可能产生诸如修改敏感数据之类的潜在有害副作用,则应用程序很容易受到跨站点请求伪造攻击。 你需要重新设计应用程序,以便仅 HTTP POST、PUT 或 DELETE 请求能执行敏感操作。
对于处理 HTTP POST、PUT 或 DELETE 请求的ASP.NET MVC 控制器操作,请添加 ValidateAntiForgeryTokenAttribute 以及指定允许的 HTTP 谓词属性(AcceptVerbsAttribute、HttpPostAttribute、HttpPutAttribute 或 HttpDeleteAttribute)。 此外,还需从 MVC 视图或 Razor 网页调用 HtmlHelper.AntiForgeryToken() 方法。 有关示例,请参阅检查编辑方法和编辑视图。
何时禁止显示警告
在以下情况下,禁止显示此规则的警告是安全的:
- 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;
}
}
}