Compartir a través de


CA3147: Marcar los controladores de verbo con ValidateAntiForgeryToken

Propiedad Value
Identificador de la regla CA3147
Título Marcar los controladores de verbo con ValidateAntiForgeryToken
Categoría Seguridad
La corrección interrumpe o no interrumpe Poco problemático
Habilitado de forma predeterminada en .NET 8 No

Causa

Un método de acción del controlador ASP.NET MVC no está marcado con ValidateAntiForgeryTokenAttribute o un atributo que especifica el verbo HTTP, como HttpGetAttribute o AcceptVerbsAttribute.

Descripción de la regla

Al diseñar un controlador ASP.NET MVC, tenga en cuenta los ataques de falsificación de solicitudes entre sitios. Un ataque al de falsificación de solicitud entre sitios puede enviar solicitudes malintencionadas desde un usuario autenticado a un controlador ASP.NET MVC. Para obtener más información, vea Prevención de XSRF/CSRF en ASP.NET MVC y páginas web.

Esta regla comprueba que los métodos de acción del controlador ASP.NET MVC sean uno de los siguientes:

Cómo corregir infracciones

  • En el caso de las acciones del controlador ASP.NET MVC que controlan solicitudes HTTP GET y no tienen efectos secundarios potencialmente perjudiciales, agregue un HttpGetAttribute al método.

    Si tiene una acción de controlador ASP.NET MVC que controla solicitudes HTTP GET y tiene efectos secundarios potencialmente perjudiciales, como la modificación de datos confidenciales, la aplicación es vulnerable a los ataques de falsificación de solicitudes entre sitios. Tendrá que rediseñar la aplicación para que solo las solicitudes HTTP POST, PUT o DELETE realicen operaciones confidenciales.

  • En el caso de las acciones del controlador ASP.NET MVC que controlan las solicitudes HTTP POST, PUT o DELETE, agregue ValidateAntiForgeryTokenAttribute y atributos que especifiquen los verbos HTTP permitidos (AcceptVerbsAttribute, HttpPostAttribute, HttpPutAttribute o HttpDeleteAttribute). Además, debe llamar al método HtmlHelper. AntiForgeryToken() desde la vista de MVC o la página web de Razor. Para obtener un ejemplo, vea Examinar los métodos y la vista Edit.

Cuándo suprimir las advertencias

Se puede suprimir una advertencia de esta regla si:

  • La acción del controlador ASP.NET MVC no tiene efectos secundarios dañinos.
  • La aplicación valida el token antifalsificación de otra forma.

Supresión de una advertencia

Si solo quiere suprimir una única infracción, agregue directivas de preprocesador al archivo de origen para deshabilitar y volver a habilitar la regla.

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

Para deshabilitar la regla de un archivo, una carpeta o un proyecto, establezca su gravedad en none del archivo de configuración.

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

Para obtener más información, consulte Procedimiento para suprimir advertencias de análisis de código.

Ejemplo del atributo ValidateAntiForgeryToken

Infracción:

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

Solución:

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

Ejemplo del atributo HttpGet

Infracción:

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

Solución:

namespace TestNamespace
{
    using System.Web.Mvc;

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