csrf - the - validateantiforgerytoken ajax
¿Cómo funciona AntiForgeryToken? (2)
Estoy tratando de protegerme de CSRF y tengo dos ejemplos:
- Haciendo POST desde otro sitio y falla cuando habilito AntiForgeryToken
- He intentado desde mi Javascript "malicioso" (que se ejecuta en otro sitio) hacer GET de la página, analizarla y extraer RequestVerificationToken y luego hacer una POST. Esto también falla pero no me queda claro por qué?
¿Alguien puede explicar por qué?
Aquí hay un buen tutorial sobre CSRF:
Aquí está la idea general: ha iniciado sesión en el sitio web de su banco. Su banco coloca una cookie en su máquina para que pueda autenticarse. Cada vez que realiza una solicitud para (es decir, cargar una página desde) yourbank.com, el navegador envía la cookie al servidor web y el código en el servidor web comprueba la cookie para asegurarse de que esté autenticado. Genial.
Sin embargo, si bien la cookie aún no ha caducado, revisa su correo y abre un correo electrónico de un Príncipe de Nigeria que le indica que haga clic en un enlace. Haz clic en él (quién puede resistirse) y en lugar de llevarte a la página que el Príncipe ha descrito, el enlace te lleva a esta URL:
http://yourbank.com/transfer.aspx?amt=1000000&from=myAccount&to=princeAccount
Debido a que ya está autenticado en su banco (a través de la cookie), cree que en realidad está solicitando la transferencia del dinero, por lo que lo hace.
Obviamente, esto es un poco de un ejemplo artificial, pero se entiende. De manera más realista, el enlace podría enviar una solicitud que cambie su dirección de correo electrónico en un sitio web del foro al que pertenece o algo así, para que puedan acceder a ella.
Así que ahora, a responder a su pregunta específica:
Una forma de combatir esto (utilizada por Ruby y .NET y otros) es incluir un token anti-falsificación. Básicamente, cuando solicita una página, el servidor incluye un campo oculto con un valor cifrado. Y cuando envía el formulario, el sitio web examina la cookie para asegurarse de que está autenticado, pero también revisa el valor cifrado que el navegador envía y se asegura de que sea válido. El token cifrado sería en realidad un identificador de sesión al que está vinculada su cuenta. Así que el servidor ve la cookie, lo identifica como usuario 123, y luego verifica el token del campo de formulario cifrado, descifra el valor y se asegura de que el valor no cifrado coincida con su sesión o identificación de usuario o algo así. Si lo hace, sabe proceder.
El príncipe nigeriano que le envió el enlace no sabrá cuál es su ID de sesión, e incluso si lo hiciera, no podría cifrarlo con la misma clave y algoritmo que usa el sitio web.
Y ahí lo tienes. Derrotando a los príncipes nigerianos, un token anti-falsificación a la vez.
(Nada contra Nigeria o los nigerianos aquí. Estoy seguro de que son personas encantadoras. Es solo que sus príncipes a veces se comportan un poco mal.) :)
Por razones de seguridad, no puede recuperar contenido de otro dominio usando AJAX.
Por lo tanto, otros sitios no pueden obtener su token.