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:
Tener ValidateAntiforgeryTokenAttribute y especificar verbos HTTP permitidos, sin incluir HTTP GET.
Especificar HTTP GET como verbo permitido.
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;
}
}
}