La forma común de evitar solicitudes de CSRF: cada vez que el usuario carga una página que contiene un formulario para POSTAR, se le emite un token de CSRF que se supone que es desconocido para los sitios de terceros potencialmente malintencionados. El token se emite como una cookie y como un campo oculto <form>
. El cliente debe autenticar cada solicitud POST colocando un token CSRF válido en el cuerpo de la solicitud y presentando una cookie válida.
Digamos que el usuario ha iniciado sesión en example.com
y, en otra pestaña, busca en evil.com
; y evil.com
quiere atacar a example.com/form.html
. Entiendo que evil.com
puede emitir una solicitud POST a un example.com/form.html
y este sitio interpretará esta solicitud POST maliciosa como una solicitud válida proveniente del usuario. Los tokens CSRF previenen este escenario, porque se supone que son desconocidos para evil.com
; no puede enviar el token correcto con su solicitud POST maliciosa, por lo que el servidor example.com
rechazará esa solicitud.
Y aquí viene la parte que no entiendo. El token CSRF se emite como una cookie y como un campo de formulario oculto. Para la parte de cookies, esto es trivial: IIUC cada solicitud a example.com
contiene automáticamente todas las cookies que vienen de example.com
; por lo tanto, suponiendo que en otra pestaña, el usuario haya iniciado sesión en example.com
, la solicitud POST maliciosa contendrá la cookie CSRF válida. ¿Esto es correcto?
Para la parte del campo de formulario oculto, esto se vuelve un poco más complicado, pero no mucho. Evil.com
puede emitir un GET XMLHttpRequest para example.com/form.html
y esa solicitud será exitosa, ya que el usuario ha iniciado sesión en este sitio en otra pestaña y porque las solicitudes GET no están protegidas por CSRF. En respuesta, evil.com
obtiene example.com/form.html
fuente HTML, que contiene el <form>
en cuestión, que a su vez contiene el campo oculto <input>
con el token CSRF. Evil.com
ahora puede analizar el documento recibido, extraer el token y agruparlo con su posterior solicitud POST malintencionada para example.com/form.html
, y así completar con éxito un ataque CSRF.
¿Qué está mal en mi razonamiento anterior? ¿Qué es lo que no entiendo?