ValidateAntiForgeryToken propósito, explicación y ejemplo


310

¿Podría explicar el propósito de ValidateAntiForgeryToken y mostrarme un ejemplo sobre ValidateAntiForgeryTokenMVC 4?

¿No pude encontrar ningún ejemplo que explique este atributo?


8

1
Por cierto, realmente no entiendo por qué la EM no ha permitido poner esto dentro del .BeginFormayudante. Así que esto está allí automáticamente, como en Rails
jazzcat

Respuestas:


350

El soporte antifalsificación de MVC escribe un valor único en una cookie solo HTTP y luego se escribe el mismo valor en el formulario. Cuando se envía la página, se genera un error si el valor de la cookie no coincide con el valor del formulario.

Es importante tener en cuenta que la función evita las falsificaciones de solicitudes entre sitios . Es decir, un formulario de otro sitio que publica en su sitio en un intento de enviar contenido oculto utilizando las credenciales de un usuario autenticado. El ataque implica engañar al usuario conectado para que envíe un formulario, o simplemente desencadenar un formulario mediante programación cuando se carga la página.

La función no evita ningún otro tipo de falsificación de datos o ataques basados ​​en manipulación.

Para usarlo, decore el método de acción o controlador con el ValidateAntiForgeryTokenatributo y realice una llamada a @Html.AntiForgeryToken()los formularios que se publican en el método.


55
@ Chris Son las dos cosas. Según mi respuesta: "escribe un valor único en una cookie solo HTTP y luego se escribe el mismo valor en el formulario "
Richard Szalay

21
¿Por qué no se configura esto por defecto?
Christian Hagelid

12
@Christian porque no es Ruby on Rails. ;-)
Martin Capodici

66
Parece que la forma __RequestVerificationToken y la cookie __RequestVerificationToken no son lo mismo, funcionan como un par.
WaiKit Kung

55
@rdans Para nada, CORS y CSRF son completamente diferentes. CORS es para permitir que otros dominios accedan a las API en su servidor, CSRF se trata de asegurarse de que una publicación del formulario provenga de la página que esperaba.
Richard Szalay

52

El propósito básico del atributo ValidateAntiForgeryToken es evitar ataques de falsificación de solicitudes entre sitios.

Una falsificación de solicitud entre sitios es un ataque en el que se envía un elemento de script dañino, un comando malicioso o un código desde el navegador de un usuario confiable. Para obtener más información sobre esto, visite http://www.asp.net/mvc/overview/security/xsrfcsrf-prevention-in-aspnet-mvc-and-web-pages .

Es simple de usar, necesita decorar el método con el atributo ValidateAntiForgeryToken de la siguiente manera:

[HttpPost]  
[ValidateAntiForgeryToken]  
public ActionResult CreateProduct(Product product)  
{
  if (ModelState.IsValid)  
  {
    //your logic 
  }
  return View(ModelName);
}

Se deriva del espacio de nombres System.Web.Mvc.

Y en su opinión, agregue este código para agregar el token para que se use para validar el formulario al enviarlo.

@Html.AntiForgeryToken()

Sí, tiene razón, debe llamar a @ Html.AntiForgeryToken () desde su formulario y agregar ValidateAntiForgeryTokenAttribute al método de acción que desea proteger.
Chandra Malla

Gracias por esta respuesta fácil de entender :)
noobprogrammer

4

En ASP.Net Core, el token anti falsificación se agrega automáticamente a los formularios, por lo que no necesita agregarlo @Html.AntiForgeryToken()si usa el elemento de formulario de afeitar o si usa IHtmlHelper.BeginForm y si el método del formulario no es GET.

Generará un elemento de entrada para su formulario similar a este: <input name="__RequestVerificationToken" type="hidden" value="CfDJ8HSQ_cdnkvBPo-jales205VCq9ISkg9BilG0VXAiNm3Fl5Lyu_JGpQDA4_CLNvty28w43AL8zjeR86fNALdsR3queTfAogif9ut-Zd-fwo8SAYuT0wmZ5eZUYClvpLfYm4LLIVy6VllbD54UxJ8W6FA">

Y cuando el usuario envía el formulario, este token se verifica en el lado del servidor si la validación está habilitada.

[ValidateAntiForgeryToken]El atributo se puede utilizar contra acciones. Las solicitudes realizadas a acciones que tienen este filtro aplicado se bloquean a menos que la solicitud incluya un token antiforgery válido.

[AutoValidateAntiforgeryToken]El atributo se puede utilizar contra los controladores. Este atributo funciona de manera idéntica al atributo ValidateAntiForgeryToken, excepto que no requiere tokens para las solicitudes realizadas utilizando los siguientes métodos HTTP: GET HEAD OPTIONS TRACE

Información adicional: https://docs.microsoft.com/pl-pl/aspnet/core/security/anti-request-forgery


2

Microsoft nos proporciona una funcionalidad incorporada que utilizamos en nuestra aplicación con fines de seguridad, para que nadie pueda piratear nuestro sitio o invadir alguna información crítica.

Desde el propósito de validarAntiForgeryToken en la aplicación MVC de Harpreet Singh:

Uso de ValidateAntiForgeryToken

Probemos con un ejemplo simple para entender este concepto. No quiero complicarlo demasiado, por eso voy a usar una plantilla de una aplicación MVC, ya disponible en Visual Studio. Haremos esto paso a paso. Empecemos.

  1. Paso 1: cree dos aplicaciones MVC con plantilla de Internet predeterminada y asigne esos nombres como CrossSite_RequestForgery y Attack_Application respectivamente.

  2. Ahora, abra la configuración web de la aplicación CrossSite_RequestForgery y cambie la cadena de conexión con la que se muestra a continuación y luego guarde.

``

<connectionStrings> <add name="DefaultConnection" connectionString="Data Source=local\SQLEXPRESS;Initial Catalog=CSRF;
Integrated Security=true;" providerName="System.Data.SqlClient" /> 
 </connectionStrings>
  1. Ahora, haga clic en Herramientas >> NuGet Package Manager, luego Package Manager Console

  2. Ahora, ejecute los tres comandos mencionados a continuación en Package Manager Console para crear la base de datos.

Enable-Migrations agregar-migración primera actualización-base de datos

Notas importantes: he creado una base de datos con el primer enfoque de código porque quiero hacer este ejemplo en la forma en que trabajan los desarrolladores. Puede crear una base de datos manualmente también. Es tu elección.

  1. Ahora, abra el controlador de cuenta. Aquí, verá un método de registro cuyo tipo es post. Por encima de este método, debe haber un atributo disponible como [ValidateAntiForgeryToken]. Comenta este atributo. Ahora, haga clic derecho en registrarse y haga clic en Ir a Ver. De nuevo, encontrará un ayudante html como @ Html.AntiForgeryToken (). Comenta este también. Ejecute la aplicación y haga clic en el botón de registro. La URL se abrirá como:

http: // localhost: 52269 / Cuenta / Registrarse

Notas : ahora sé que la pregunta que se plantea en la mente de todos los lectores es por qué estos dos ayudantes deben ser comentados, ya que todos saben que se usan para validar la solicitud. Entonces, solo quiero que todos sepan que esto es solo porque quiero mostrar la diferencia después y antes de aplicar estos ayudantes.

  1. Ahora, abra la segunda aplicación que es Attack_Application. Luego, abra el método de registro del controlador de cuenta. Simplemente cambie el método POST con el simple, que se muestra a continuación.

    Formulario de inscripción
    1. @ Html.LabelFor (m => m.UserName) @ Html.TextBoxFor (m => m.UserName)
    2. @ Html.LabelFor (m => m.Password) @ Html.PasswordFor (m => m.Password)
    3. @ Html.LabelFor (m => m.ConfirmPassword) @ Html.PasswordFor (m => m.ConfirmPassword)

7. Ahora, suponga que es un hacker y conoce la URL desde donde puede registrar el usuario en la aplicación CrossSite_RequestForgery. Ahora, creó un sitio de falsificación como Attacker_Application y simplemente puso la misma URL en el método de publicación.

8. Ejecute esta aplicación ahora y complete los campos de registro y haga clic en registrarse. Verá que está registrado en la aplicación CrossSite_RequestForgery. Si revisa la base de datos de la aplicación CrossSite_RequestForgery, verá la entrada que ingresó.

  1. Importante: ahora, abra la aplicación CrossSite_RequestForgery y comente el token en el Controlador de cuenta y registre la Vista. Intente registrarse nuevamente con el mismo proceso. Entonces, se producirá un error como el siguiente.

Error del servidor en la aplicación '/'. ________________________________________ La cookie antifalsificación requerida "__RequestVerificationToken" no está presente.

Esto es lo que dice el concepto. Lo que agregamos en View, es decir, @ Html.AntiForgeryToken () genera __RequestVerificationToken en el tiempo de carga y [ValidateAntiForgeryToken] disponible en el método Controller. Haga coincidir este token en la hora de publicación. Si el token es el mismo, significa que esta es una solicitud válida.


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.