Entiendo el propósito del encabezado Access-Control-Allow-Credentials
, pero no veo el problema del Access-Control-Allow-Origin
el encabezado resuelve.
Más precisamente, es fácil ver cómo, si las solicitudes AJAX entre dominios con credenciales estaban permitidas de forma predeterminada, o si algún servidor escupía Access-Control-Allow-Credentials
en cada solicitud, los ataques CSRF serían posibles que de otra manera no podrían 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 recipiente tradicional para una solicitud CSRF, como un formulario POST, para realizar acciones utilizando la combinación de las cookies del usuario y su token CSRF robado.
Sin embargo, lo que no puedo ver es cuál es el propósito de no permitir solicitudes AJAX entre dominios sin credencial sin un Access-Control-Allow-Origin encabezado. Supongamos que creara un navegador que se comportara como si cada respuesta HTTP que alguna vez recibió contuviera
Access-Control-Allow-Origin: *
pero aún así requiere un encabezado Access-Control-Allow-Credentials
apropiado antes de enviar cookies con solicitudes AJAX entre dominios.
Dado que los tokens CSRF deben estar vinculados a usuarios individuales (es decir, a sesiones individuales cookies), la respuesta a una solicitud AJAX sin credencial no expondría ningún token CSRF. Entonces, ¿a qué método de ataque, si corresponde, al que el navegador hipotético descrito anteriormente expondría a sus usuarios?