Partilhar via


CA3147: Marcar manipuladores de verbos com ValidateAntiForgeryToken

Property valor
ID da regra CA3147
Título Marcar manipuladores de verbos com ValidateAntiForgeryToken
Categoria Segurança
A correção está quebrando ou não quebrando Sem quebra
Habilitado por padrão no .NET 9 Não

Motivo

Um método de ação do controlador MVC ASP.NET não está marcado com ValidateAntiForgeryTokenAttribute, ou um atributo especificando o verbo HTTP, como HttpGetAttribute ou AcceptVerbsAttribute.

Descrição da regra

Ao projetar um controlador MVC ASP.NET, esteja atento aos ataques de falsificação de solicitação entre sites. Um ataque de falsificação de solicitação entre sites pode enviar solicitações maliciosas de um usuário autenticado para seu controlador MVC ASP.NET. Para obter mais informações, consulte Prevenção de XSRF/CSRF em ASP.NET MVC e páginas da Web.

Esta regra verifica se ASP.NET métodos de ação do controlador MVC:

  • Tenha o ValidateAntiforgeryTokenAttribute e especifique verbos HTTP permitidos, não incluindo HTTP GET.

  • Especifique HTTP GET como um verbo permitido.

Como corrigir violações

  • Para ASP.NET ações do controlador MVC que manipulam solicitações HTTP GET e não têm efeitos colaterais potencialmente prejudiciais, adicione um HttpGetAttribute ao método.

    Se você tiver uma ação de controlador MVC ASP.NET que lida com solicitações HTTP GET e tenha efeitos colaterais potencialmente prejudiciais, como modificar dados confidenciais, seu aplicativo estará vulnerável a ataques de falsificação de solicitação entre sites. Você precisará redesenhar seu aplicativo para que apenas solicitações HTTP POST, PUT ou DELETE executem operações confidenciais.

  • Para ASP.NET ações do controlador MVC que manipulam solicitações HTTP POST, PUT ou DELETE, adicione ValidateAntiForgeryTokenAttribute e atributos especificando os verbos HTTP permitidos (AcceptVerbsAttribute, HttpPostAttribute, HttpPutAttribute ou HttpDeleteAttribute). Além disso, você precisa chamar o método HtmlHelper.AntiForgeryToken() de sua visualização MVC ou página da Web Razor. Para obter um exemplo, consulte Examinando os métodos de edição e o modo de exibição de edição.

Quando suprimir avisos

É seguro suprimir um aviso desta regra se:

  • A ação ASP.NET do controlador MVC não tem efeitos colaterais prejudiciais.
  • O aplicativo valida o token antifalsificação de uma maneira diferente.

Suprimir um aviso

Se você quiser apenas suprimir uma única violação, adicione diretivas de pré-processador ao seu arquivo de origem para desativar e, em seguida, reativar a regra.

#pragma warning disable CA3147
// The code that's violating the rule is on this line.
#pragma warning restore CA3147

Para desabilitar a regra de um arquivo, pasta ou projeto, defina sua gravidade como none no arquivo de configuração.

[*.{cs,vb}]
dotnet_diagnostic.CA3147.severity = none

Para obter mais informações, consulte Como suprimir avisos de análise de código.

Exemplo de atributo ValidateAntiForgeryToken

Violação:

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

Solução:

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

Exemplo de atributo HttpGet

Violação:

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

Solução:

namespace TestNamespace
{
    using System.Web.Mvc;

    public class TestController : Controller
    {
        [HttpGet]
        public ActionResult Help(int topicId)
        {
            return null;
        }
    }
}