CA5391: Usar tokens antifalsificação em controladores MVC do ASP.NET Core
Property | Valor |
---|---|
ID da regra | CA5391 |
Título | Usar tokens antifalsificação em controladores MVC do ASP.NET Core |
Categoria | Segurança |
Correção interruptiva ou sem interrupção | Sem interrupção |
Habilitado por padrão no .NET 8 | Não |
Causa
As ações que resultam na modificação de operações não têm um atributo de token antifalsificação. Ou, o uso de um filtro de token antifalsificação global sem chamar as funções de token antifalsificação esperadas.
Descrição da regra
Manipular uma solicitação POST
, PUT
, PATCH
ou DELETE
sem validar um token antifalsificação pode gerar vulnerabilidades relacionadas a ataques de solicitação intersite forjada. Um ataque de solicitação intersite forjada pode enviar solicitações mal-intencionadas de um usuário autenticado para o controlador MVC do ASP.NET Core.
Como corrigir violações
- Marque a ação de modificação com um atributo de token antifalsificação válido:
- Microsoft.AspNetCore.Mvc.ValidateAntiForgeryTokenAttribute.
- Atributo cujo nome é semelhante a
%Validate%Anti_orgery%Attribute
.
- Adicione o atributo de token contra falsificação válido ao filtro global com Microsoft.AspNetCore.Mvc.Filters.FilterCollection.Add.
- Adicione qualquer classe de filtro antifalsificação personalizada ou fornecida por Mvc que chame
Validate
em qualquer classe que implemente a interface Microsoft.AspNetCore.Antiforgery.IAntiforgery.
Quando suprimir avisos
É seguro suprimir essa regra se soluções diferentes do uso de atributos de token antifalsificação são adotadas para mitigar vulnerabilidades de CSRF. Para obter mais informações, consulte Impedir ataques de XSRF/CSRF (solicitação intersite forjada) no ASP.NET Core.
Suprimir um aviso
Para suprimir apenas uma violação, adicione diretivas de pré-processador ao arquivo de origem a fim de desabilitar e, em seguida, reabilitar a regra.
#pragma warning disable CA5391
// The code that's violating the rule is on this line.
#pragma warning restore CA5391
Para desabilitar a regra em um arquivo, uma pasta ou um projeto, defina a severidade como none
no arquivo de configuração.
[*.{cs,vb}]
dotnet_diagnostic.CA5391.severity = none
Para obter mais informações, confira Como suprimir avisos de análise de código.
Configurar código para analisar
Você pode configurar se a regra se aplica somente a classes derivadas de Microsoft.AspNetCore.Mvc.Controller da sua base de código. Por exemplo, para especificar que a regra não deve ser executada em nenhum código dentro de tipos derivados de ControllerBase, adicione o seguinte par chave-valor a um arquivo .editorconfig no seu projeto:
dotnet_code_quality.CA5391.exclude_aspnet_core_mvc_controllerbase = true
Exemplos de pseudocódigo
Sem violação de atributo de token antifalsificação
using Microsoft.AspNetCore.Mvc;
class ExampleController : Controller
{
[HttpDelete]
public IActionResult ExampleAction (string actionName)
{
return null;
}
[ValidateAntiForgeryToken]
[HttpDelete]
public IActionResult AnotherAction (string actionName)
{
return null;
}
}
Sem filtro antifalsificação global válido
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));
}
}
Marcado com uma solução de atributo de token antifalsificação
using Microsoft.AspNetCore.Mvc;
class ExampleController : Controller
{
[ValidateAntiForgeryToken]
[HttpDelete]
public IActionResult ExampleAction ()
{
return null;
}
[ValidateAntiForgeryToken]
[HttpDelete]
public IActionResult AnotherAction ()
{
return null;
}
}
Usar filtro antifalsificação global válido
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));
}
}