¿Por qué es necesario el encabezado Access-Control-Allow-Origin?

49

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:

  1. Atraer a un usuario desprevenido a mi página maliciosa.
  2. JavaScript en mi página maliciosa envía una solicitud AJAX - con cookies - a alguna página de un sitio de destino.
  3. JavaScript en mi página maliciosa analiza la respuesta a la solicitud AJAX y extrae el token CSRF de ella.
  4. 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?

    
pregunta Mark Amery 10.10.2013 - 19:11
fuente

2 respuestas

25

Si lo entiendo correctamente, ¿está diciendo por qué el navegador está bloqueando el acceso a un recurso que puede obtenerse libremente a través de Internet si las cookies no están involucradas? Bueno consideremos este escenario:

www.evil.com : contiene un código de script malicioso que busca explotar las vulnerabilidades de CSRF.

www.privatesite.com : este es su sitio externo, pero en lugar de bloquearlo usando credenciales, lo configuró para que no tenga cookies y solo permita el acceso desde la IP estática de su enrutador doméstico.

mynas (192.168.1.1) : este es su servidor doméstico, solo accesible en su red wifi doméstica. Dado que usted es el único al que permite conectarse a la red wifi de su hogar, este servidor no está protegido por credenciales y permite el acceso anónimo y sin cookies.

Tanto www.privatesite.com como mynas generan tokens en campos ocultos para la protección contra CSRF, pero debido a que ha deshabilitado la autenticación, estos tokens no están vinculados a ninguna sesión de usuario.

Ahora, si accidentalmente visita www.evil.com , este dominio podría estar haciendo solicitudes para que www.privatesite.com/turn_off_ip_lockdown pase el token obtenido por la solicitud de dominio cruzado, o incluso para mynas/format_drive usando el mismo método.

Es poco probable que lo sepa, pero creo que el estándar está escrito para ser tan sólido como sea posible y no tiene sentido eliminar Access-Control-Allow-Origin ya que agrega beneficios en escenarios como este.

    
respondido por el SilverlightFox 18.10.2013 - 17:00
fuente
9

Lo que inicialmente me molestó con las políticas de CORS fue su aplicación indiscriminada independientemente del recurso / tipo, creo que el sentimiento resuena bastante bien con tu pregunta. La especificación W3 en realidad informa que:

  

Un recurso al que se puede acceder públicamente, sin controles de acceso,   Siempre puede devolver de forma segura un encabezado de Control de acceso / Autorización de origen cuyo   el valor es "*"

Entonces, mientras que el escenario en @ la respuesta de SilverlightFox es posible, IMHO no era probable que se considerara al escribir el especulación. En su lugar, W3 parece estar impulsado por una mentalidad "todo lo que no se permite explícitamente debe estar restringido" en esta instancia, que falla cuando no se establecen los encabezados correctos o los navegadores individuales carecen de soporte:

  • Aplicaciones enriquecidas del lado del cliente que utilizan APIs RESTful de terceros donde la autenticación, si corresponde, se envía con cada solicitud para que no haya una "sesión" que se pueda secuestrar (¡no tiene sentido para usted!). Sin embargo, las respuestas de .json están sujetas a CORS, por lo que ahora tiene que convencer al tercero para que implemente jsonp , o un encabezado Access-Control-Allow-Origin adecuado, o renuncie y configure un túnel hasta su punto final (adivine cuál es el '' Estaré usando).

  • Webfonts están sujetos a CORS , aunque solo implementó Firefox este proyecto de especificaciones. Esto significa que si estás usando un CDN para las fuentes (o un subdominio para todo el contenido estático), ¡lo mejor es que esté habilitado para * !

  • El bono herp derp apunta a los CDN que no responden con un encabezado * , sino que repiten el valor del encabezado Origin de la solicitud: si se almacena en caché en un proxy con una ...-Allow-Origin: domainA , sus usuarios de otros dominios no podrán acceder a él sin el almacenamiento en caché (lo que es un retroceso en términos de beneficios de rendimiento de CDN).

  • También hay algunos escenarios adicionales como usando imágenes / videos externos con canvas .

Estos inconvenientes al acceder a los recursos adecuados para * podrían considerarse simplemente aceptables, ya que al menos CORS está en juego de forma predeterminada cuando más importa .

    
respondido por el o.v. 18.11.2013 - 22:50
fuente

Lea otras preguntas en las etiquetas