Esta pregunta solo trata sobre la protección contra ataques de falsificación de solicitudes entre sitios.
Se trata específicamente de: ¿Es la protección a través del encabezado de origen (CORS) tan buena como la protección a través de un token CSRF?
Ejemplo:
- Alice inició sesión (usando una cookie) con su navegador en " https://example.com ". Supongo que usa un navegador moderno.
- Alice visita " https://evil.com " y el código del lado del cliente de evil.com realiza algún tipo de solicitud a " https://example.com " (escenario clásico de CSRF).
Entonces:
- Si no verificamos el encabezado de origen (del lado del servidor) y no hay un token CSRF, tenemos un agujero de seguridad CSRF.
- Si revisamos un token CSRF, estamos a salvo (pero es un poco tedioso).
- Si verificamos el encabezado Origin, la solicitud del código del lado del cliente de evil.com debería bloquearse tan bien como lo haría cuando se usa un token CSRF, excepto, si es posible de alguna manera que el código de evil.com configure el encabezado Origin.
Sé que esto no debería ser posible con XHR (ver, por ejemplo, Seguridad para compartir recursos de origen cruzado ), al menos no, si confiamos en que la especificación W3C se implementará correctamente en todos los navegadores modernos (¿podemos?)
Pero, ¿qué pasa con otros tipos de solicitudes, por ejemplo, envío de formularios? ¿Cargando una etiqueta script / img / ...? ¿O de cualquier otra forma que una página pueda utilizar para crear (legalmente) una solicitud? ¿O quizás algún truco de JS conocido?
Nota: no estoy hablando de
- aplicaciones nativas,
- navegadores manipulados,
- errores de secuencias de comandos entre sitios en la página de example.com,
- ...
fuente
Origin
? Eso negaría la protección de CORS.Respuestas:
Al final del día, debe "confiar" en el navegador del cliente para almacenar de forma segura los datos del usuario y proteger el lado del cliente de la sesión. Si no confía en el navegador del cliente, debe dejar de usar la web para cualquier otra cosa que no sea contenido estático. Incluso con el uso de tokens CSRF, está confiando en que el navegador del cliente obedecerá correctamente la Política del mismo origen .
Si bien ha habido vulnerabilidades de navegador anteriores, como las de IE 5.5 / 6.0, en las que los atacantes podían eludir la Política del mismo origen y ejecutar ataques, normalmente se puede esperar que se reparen tan pronto como se descubran y que la mayoría de los navegadores se actualicen automáticamente. , este riesgo se mitigará en su mayor parte.
La
Origin
cabecera es normalmente sólo se envió para XHR solicitudes entre dominios. Las solicitudes de imágenes no contienen el encabezado.No estoy seguro de si esto cae dentro de los navegadores manipulados o no, pero las versiones antiguas de Flash permitían que se establecieran encabezados arbitrarios que permitirían a un atacante enviar una solicitud con un
referer
encabezado falso desde la máquina de la víctima para ejecutar un ataque.fuente
crossdomain.xml
que puede habilitar la comunicación entre dominios.El contenido web no puede alterar el encabezado de Origin. Además, bajo la misma política de origen, un origen ni siquiera puede enviar encabezados personalizados a otros orígenes. [1]
Por lo tanto, verificar el encabezado de Origin es tan bueno para bloquear ataques como usar un token CSRF.
La principal preocupación de confiar en esto es si permite que funcionen todas las solicitudes legítimas. El autor de la pregunta conoce este problema y ha configurado la pregunta para descartar los casos principales (sin navegadores antiguos, solo HTTPS).
Los proveedores de navegadores siguen estas reglas, pero ¿qué pasa con los complementos? Puede que no, pero la pregunta ignora los "navegadores manipulados". ¿Qué pasa con los errores en el navegador que permiten a un atacante falsificar el encabezado de Origin? Puede haber errores que permitan que el token CSRF también se filtre a través de los orígenes, por lo que sería necesario más trabajo argumentar que uno es mejor que el otro.
fuente