javascript security cors csrf

javascript - Protección CSRF con cabecera CORS Origin frente a token CSRF



security (2)

saber que esto no debería ser posible con XHR (ver por ejemplo, Seguridad para el intercambio de recursos de origen cruzado), al menos no, si confiamos en que la especificación W3C se implemente correctamente en todos los navegadores modernos (¿podemos?)

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ías en el navegador del cliente, entonces debes dejar de usar la web para nada que no sea contenido estático. Incluso con el uso de tokens CSRF, confía en que el navegador del cliente obedezca correctamente la política Same Origin .

Si bien ha habido vulnerabilidades anteriores del navegador, como las de IE 5.5 / 6.0, donde los atacantes han eludido la Política de origen idéntico y ejecutan ataques, normalmente puede esperar que se apliquen parches tan pronto como se descubran y que la mayoría de los navegadores actualicen automáticamente , este riesgo será mayormente mitigado.

Pero, ¿qué pasa con otros tipos de solicitudes, por ejemplo, enviar formulario? Cargando una secuencia de comandos / img / ... tag? ¿O de cualquier otra forma que una página pueda usar para (legalmente) crear una solicitud? ¿O tal vez algún hack conocido de JS?

El encabezado Origin normalmente solo se envía para solicitudes de dominio cruzado XHR. Las solicitudes de imagen no contienen el encabezado.

Nota: no estoy hablando de

  • aplicaciones nativas,

  • navegadores manipulados,

  • cruzar errores de scripting en la página de example.com,

No estoy seguro de si esto cae bajo navegadores manipulados o no, pero las versiones anteriores de Flash permitieron que se establecieran encabezados arbitrarios que permitieran a un atacante enviar una solicitud con un encabezado de referente falso desde la máquina de la víctima para ejecutar un ataque.

Esta pregunta se trata de proteger contra los ataques de falsificación de solicitudes entre sitios solamente.

Se trata específicamente de: ¿La protección a través del encabezado Origin (CORS) es tan buena como la protección mediante un token CSRF?

Ejemplo:

  • Alice ha iniciado sesión (usando una cookie) con su navegador en " https://example.com ". Supongo que ella 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).

Asi que:

  • Si no verificamos el encabezado Origen (lado del servidor) y ningún token CSRF, tenemos un agujero de seguridad CSRF.
  • Si comprobamos un token CSRF, estamos seguros (pero es un poco tedioso).
  • Si revisamos el encabezado Origen, la solicitud del código del lado del cliente de evil.com debe bloquearse tan bien como cuando se utiliza un token CSRF, excepto si es posible que el código de evil.com establezca el encabezado Origin.

Sé que esto no debería ser posible con XHR (consulte, por ejemplo, Seguridad para compartir recursos de origen cruzado ), al menos no, si confiamos en que la especificación W3C se implemente correctamente en todos los navegadores modernos (¿podemos?)

Pero, ¿qué pasa con otros tipos de solicitudes, por ejemplo, enviar formulario? Cargando una secuencia de comandos / img / ... tag? ¿O de cualquier otra forma que una página pueda usar para (legalmente) crear una solicitud? ¿O tal vez algún hack conocido de JS?

Nota: no estoy hablando de

  • aplicaciones nativas,
  • navegadores manipulados,
  • cruzar errores de scripting en la página de example.com,
  • ...

El contenido web no puede alterar el encabezado de origen. 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, consultar el encabezado Origen es tan bueno para bloquear ataques como usar un token CSRF.

La principal preocupación al confiar en esto es si permite que funcionen todas las solicitudes legítimas. El asker conoce este problema y ha configurado la pregunta para descartar los principales casos (no hay navegadores antiguos, solo HTTPS).

Los vendedores del navegador siguen estas reglas, pero ¿qué pasa con los complementos? Puede que no, pero la pregunta no tiene en cuenta los "navegadores manipulados". ¿Qué hay de los errores en el navegador que permiten a un atacante forjar el encabezado de origen? Puede haber errores que permitan que el token CSRF se filtre a través de los orígenes también, por lo que se necesitaría más trabajo para argumentar que uno es mejor que el otro.