¿Por qué está prohibido CORS sin credenciales?

Estoy tratando de entender por qué no se permiten las solicitudes de dominios cruzados sin credenciales (de forma predeterminada, sin configurar el servidor para que devuelva el encabezado Access-Control-Allow-Origin ). En caso de solicitud con credenciales, todo es bastante sencillo: puede realizar algunas acciones maliciosas en su nombre en otros sitios, por ejemplo en Facebook, si ha iniciado sesión en él.

Por ejemplo esta petición:

xhr = new XMLHttpRequest(); xhr.open('GET', 'http://www.google.com'); xhr.send(); 

producir un error (lo ejecuté en la consola de Chrome desde este sitio):

XMLHttpRequest no puede cargar http://www.google.com/ . No hay ningún encabezado ‘Access-Control-Allow-Origin’ presente en el recurso solicitado. Por lo tanto, no se permite el acceso al origen ‘ http://stackoverflow.com ‘.

Por lo tanto, el servidor debe enviar un encabezado apropiado (por ejemplo, Access-Control-Allow-Origin: * ) a esta solicitud puede funcionar.

Esto es solo una simple solicitud y no se envían cookies. ¿Cuál es el sentido de tal restricción? ¿Qué problemas de seguridad podrían tener lugar si se permite dicho CORS?

Sin credenciales – quiero decir sin enviar cookies. La configuración predeterminada para XMLHTTPRequest es withCredentials = false, lo que significa que no se envían cookies en el enlace de solicitud.

Seguiré adelante y robaré generosamente de Security.SE’s ¿Por qué es necesario el encabezado Access-Control-Allow-Origin?

La principal preocupación aquí es el control de acceso basado en la topología de la red. Supongamos que ejecuta un servicio HTTP en su red doméstica (de hecho, es muy probable que lo haga, si su propio enrutador tiene una interfaz web). Llamaremos a este servicio R y las únicas máquinas conectadas a su enrutador doméstico pueden acceder al servicio.

Cuando su navegador visita evil.example.com , ese sitio le evil.example.com un script a su navegador, indicándole que busque el contenido de R y lo envíe de vuelta a evil.example.com . Esto es potencialmente malo, incluso sin credenciales, porque es una violación de la suposición de que nadie fuera de su red local puede ver los servicios que se ejecutan dentro de su red local. La política del mismo origen evita que esto suceda. Si la política del mismo origen solo entrara en juego cuando las credenciales estaban involucradas, se abriría la posibilidad de pasar por alto las protecciones basadas en la topología.

Considere también que algunos servicios públicos permiten el acceso basado en la dirección IP:

  • El Oxford English Dictionary restringe el acceso a sus entradas en línea a direcciones IP provenientes de universidades suscritas
  • El Reino Unido restringe el acceso al contenido de la BBC a la dirección IP desde el país.

En todos los casos enumerados aquí, un navegador podría usarse como un proxy involuntario para cualquier sitio que le sirva un script.