CA5391:在 ASP.NET Core MVC 控制器中使用防伪造令牌
属性 | 值 |
---|---|
规则 ID | CA5391 |
标题 | 在 ASP.NET Core MVC 控制器中使用防伪造令牌 |
类别 | 安全性 |
修复是中断修复还是非中断修复 | 非中断 |
在 .NET 8 中默认启用 | 否 |
原因
导致修改操作的操作没有防伪造令牌特性。 或者,使用全局防伪造令牌筛选器,而不调用预期的防伪造令牌函数。
规则说明
处理 POST
、PUT
、PATCH
或 DELETE
请求而不验证防伪造令牌可能易受到跨网站请求伪造攻击。 跨网站请求伪造攻击可将经过身份验证的用户的恶意请求发送到 ASP.NET Core MVC 控制器。
如何解决冲突
- 使用有效的防伪造令牌特性标记修改操作:
- Microsoft.AspNetCore.Mvc.ValidateAntiForgeryTokenAttribute。
- 名称类似
%Validate%Anti_orgery%Attribute
的特性。
- 使用 Microsoft.AspNetCore.Mvc.Filters.FilterCollection.Add 将有效的伪造令牌特性添加到全局筛选器中。
- 添加任何自定义的或 MVC 提供的防伪造筛选器类,该类针对任何实现 Microsoft.AspNetCore.Antiforgery.IAntiforgery 接口的类调用
Validate
。
何时抑制警告
如果采用除了使用防伪造令牌特性之外的其他解决方案来缓解 CSRF 漏洞,则可安全地抑制该规则。 有关详细信息,请参阅在 ASP.NET Core 中预防跨网站请求伪造 (XSRF/CSRF) 攻击。
抑制警告
如果只想抑制单个冲突,请将预处理器指令添加到源文件以禁用该规则,然后重新启用该规则。
#pragma warning disable CA5391
// The code that's violating the rule is on this line.
#pragma warning restore CA5391
若要对文件、文件夹或项目禁用该规则,请在配置文件中将其严重性设置为 none
。
[*.{cs,vb}]
dotnet_diagnostic.CA5391.severity = none
有关详细信息,请参阅如何禁止显示代码分析警告。
配置代码以进行分析
可配置该规则是否仅适用于代码库中 Microsoft.AspNetCore.Mvc.Controller 的派生类。 例如,若要指定规则不应针对 ControllerBase 的派生类型中的任何代码运行,请将以下键值对添加到项目中的 .editorconfig 文件:
dotnet_code_quality.CA5391.exclude_aspnet_core_mvc_controllerbase = true
伪代码示例
无防伪造令牌特性冲突
using Microsoft.AspNetCore.Mvc;
class ExampleController : Controller
{
[HttpDelete]
public IActionResult ExampleAction (string actionName)
{
return null;
}
[ValidateAntiForgeryToken]
[HttpDelete]
public IActionResult AnotherAction (string actionName)
{
return null;
}
}
无有效的全局防伪造筛选器
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
class ExampleController : Controller
{
[ValidateAntiForgeryToken]
[HttpDelete]
public IActionResult AnotherAction (string actionName)
{
return null;
}
[HttpDelete]
public IActionResult ExampleAction (string actionName)
{
return null;
}
}
class FilterClass : IAsyncAuthorizationFilter
{
public Task OnAuthorizationAsync (AuthorizationFilterContext context)
{
return null;
}
}
class BlahClass
{
public static void BlahMethod ()
{
FilterCollection filterCollection = new FilterCollection ();
filterCollection.Add(typeof(FilterClass));
}
}
使用防伪造令牌特性解决方案进行了标记
using Microsoft.AspNetCore.Mvc;
class ExampleController : Controller
{
[ValidateAntiForgeryToken]
[HttpDelete]
public IActionResult ExampleAction ()
{
return null;
}
[ValidateAntiForgeryToken]
[HttpDelete]
public IActionResult AnotherAction ()
{
return null;
}
}
使用有效的全局防伪造筛选器
using System.Threading.Tasks;
using Microsoft.AspNetCore.Antiforgery;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
class ExampleController : Controller
{
[ValidateAntiForgeryToken]
[HttpDelete]
public IActionResult AnotherAction()
{
return null;
}
[HttpDelete]
public IActionResult ExampleAction()
{
return null;
}
}
class FilterClass : IAsyncAuthorizationFilter
{
private readonly IAntiforgery antiforgery;
public FilterClass(IAntiforgery antiforgery)
{
this.antiforgery = antiforgery;
}
public Task OnAuthorizationAsync(AuthorizationFilterContext context)
{
return antiforgery.ValidateRequestAsync(context.HttpContext);
}
}
class BlahClass
{
public static void BlahMethod()
{
FilterCollection filterCollection = new FilterCollection();
filterCollection.Add(typeof(FilterClass));
}
}