Entiendo el propósito de Access-Control-Allow-Credentials
encabezado , pero no puede ver qué problema resuelve el encabezado Access-Control-Allow-Origin
.
Más precisamente, es fácil ver cómo, si las solicitudes AJAX entre dominios con credenciales se permitían de forma predeterminada, o si algún servidor escupía Access-Control-Allow-Credentials
encabezados en cada solicitud, los ataques CSRF Se posibilitará que de otra forma no pueda realizarse. El método de ataque en este escenario sería simple:
- Atraer a un usuario desprevenido a mi página maliciosa.
- JavaScript en mi página maliciosa envía una solicitud AJAX - con cookies - a alguna página de un sitio de destino.
- JavaScript en mi página maliciosa analiza la respuesta a la solicitud AJAX y extrae el token CSRF de ella.
- JavaScript en mi página maliciosa utiliza cualquier medio, ya sea AJAX o un barco tradicional para una solicitud CSRF, como un formulario POST - para realizar acciones utilizando la combinación de cookies del usuario y su token CSRF robado.
Sin embargo, lo que no puedo ver es qué propósito se cumple al no permitir sin credenciales solicitudes AJAX de dominio cruzado sin un encabezado Access-Control-Allow-Origin
. Supongamos que tuviera que crear un navegador que se comportara como si cada respuesta HTTP que alguna vez recibió estuviera contenida
Access-Control-Allow-Origin: *
pero aún requiere un encabezado Access-Control-Allow-Credentials
apropiado antes de enviar cookies con solicitudes AJAX de dominio cruzado.
Dado que los tokens CSRF tienen que estar vinculados a usuarios individuales (es decir, a cookies de sesión individuales), la respuesta a una solicitud AJAX sin credenciales no expondría ningún token de CSRF. Entonces, ¿a qué método de ataque, si lo hubiera, el navegador hipotético descrito anteriormente expondría a sus usuarios?