¿Devuelve Access-Control-Allow-Origin: * debilita la seguridad de las respuestas JSON GET?

6

La recomendación CORS del W3C dice:

  

Ciertos tipos de recursos no deben intentar especificar   determinados orígenes autorizados, sino que denegar o permitir   Todos los orígenes.

     

...

     

3. Una respuesta GET cuyo cuerpo de entidad pasa a analizar como      ECMAScript puede devolver un encabezado Access-Control-Allow-Origin      cuyo valor es "*" siempre que no haya comentarios confidenciales      ya que se puede acceder a él de origen cruzado usando un script HTML      elemento. Si es necesario, tales recursos pueden implementar acceso      control y protecciones CSRF como se describe anteriormente.

¿Se analiza JSON como ECMAScript?

¿Puede JSON producir efectos secundarios cuando se ejecuta a través de un elemento de script HTML?

¿Puede el contenido web de origen cruzado obtener acceso de lectura a las respuestas JSON GET de las solicitudes CSRF forjadas a través de un elemento de script HTML?

¿Qué significa "comentarios confidenciales" en este contexto?

¿Este párrafo se aplica a las solicitudes GET que no aceptan cookies o autenticación HTTP para autorización? Si una solicitud fuera autorizada de otra manera solo por OAuth, por ejemplo, su respuesta no sería accesible a un navegador a través de un elemento de script HTML. Pero al hacer que su respuesta incluya Access-Control-Allow-Origin: * para todas las solicitudes autorizadas, el servidor perderá la capacidad de especificar los orígenes a los que el navegador otorgaría acceso.

¿La inclusión de Access-Control-Allow-Origin: * no debilitaría la seguridad de las respuestas a las solicitudes autorizadas por las cookies o la autenticación HTTP? Si una solicitud fuera autorizada por una cookie, por ejemplo, sería ejecutable por el navegador, pero el código fuente en el cuerpo de la respuesta no sería accesible al contenido web de origen cruzado. Al hacer que su respuesta incluya Access-Control-Allow-Origin: * , el servidor comunicaría al navegador que el contenido web desde todos los orígenes debería tener acceso para leer la respuesta además de ejecutarla.

    
pregunta Matt McClure 16.10.2013 - 12:23
fuente

1 respuesta

2

Esto ya lo entiendes: La idea principal aquí es que los elementos del script ( <script src="http://example.com/myscript.js">)noestánsujetosarestriccionesdelmismoorigen.Porlotanto,unsitiopuedecargarcualquierURLdelscriptyejecuteesescript(siemprequeelscriptnorequieracredencialesoelnavegadortengalascredencialesnecesariasparaaccederalscript).Sinembargo,elnavegadornopuedeleerunscriptcargadoenunelemento<script>.

PuedereformularlarecomendacióndeW3Ccomo:

  

Sitodalainformacióndeunrecursosepuedeobtenerejecutandoelrecursocomounasecuenciadecomandos,puedeagregarlibrementeAccess-Control-Allow-Origin:*.

Porlotanto,JSONsinformatonocumpleconesterequisito.Siejecutaelscript:

(["foo", 5, 7])

entonces no se agrega información al entorno de ejecución. (Hace unos años, podría tener, por redefiniendo el Array constructor , pero los navegadores modernos han eliminado esta vulnerabilidad.)

Sin embargo, el script

window.secrets = ["foo", 5, 7];

hace realiza un cambio observable en el entorno de ejecución. También puede permitir que cualquier página obtenga el contenido del recurso a través de Ajax, ya que no contiene información que la página no pueda aprender ejecutando el script en un elemento <script> .

La frase "comentarios confidenciales" se refiere a los comentarios reales del código JavaScript ( /* e.g., like this */ ). Los comentarios no se pueden leer en una ejecución <script> , pero se podrían leer al acceder al contenido del script a través de Ajax. Por ejemplo, el script:

// by the way, the fourth secret is "bar"
window.secrets = ["foo", 5, 7]

filtra la misma información que en el ejemplo anterior cuando se ejecuta en una etiqueta <script> , ya que el comentario solo es visible cuando se ve el texto del script real.

Si el recurso requiere credenciales de OAuth y no acepta credenciales de cookies, sección 4 indica:

  

las solicitudes deben establecer el indicador de omitir credenciales y los recursos deben realizar la autorización utilizando tokens de seguridad explícitamente proporcionados en el contenido de la solicitud

Las solicitudes de origen cruzado a través de elementos de secuencia de comandos HTML nunca incluirían credenciales de OAuth, y esas solicitudes fallarán en la autorización independientemente del valor del encabezado Access-Control-Allow-Origin de la respuesta.

Si el recurso requiere credenciales y verificación previa, la respuesta de verificación previa también debe servirse con Access-Control-Allow-Credentials: true . Si el servidor no envía ese encabezado, un sitio no puede enviar una solicitud con credenciales de varios dominios para leer el contenido del script. Por lo tanto, Access-Control-Allow-Origin: * no debilita la seguridad del recurso protegido por credenciales, porque las credenciales para el dominio de destino no se enviarán a través de Ajax a menos que el servidor también establezca Access-Control-Allow-Credentials: true .

Si el recurso requiere credenciales pero no verificación previa, las credenciales se enviarán en la solicitud antes de que el servidor tenga la oportunidad de incluir Access-Control-Allow-Credentials: true en la respuesta. El resultado final es el mismo: el navegador no compartirá la respuesta con el contenido web de origen cruzado que realiza la solicitud, sino por diferentes motivos.

Sección 6.1 dice:

  

La cadena "*" no se puede usar para un recurso que admita credenciales.

Y la verificación de recursos compartidos pasaría por el paso 2 de sección 7.2 y falla en el paso 3:

  
  1. Si el valor del encabezado de Access-Control-Allow-Origin es el carácter "*" y se establece el indicador de omitir credenciales, se devuelve el pase y finaliza este algoritmo.
  2.   
  3. Si el valor de Access-Control-Allow-Origin no es una coincidencia entre mayúsculas y minúsculas para el valor del encabezado de origen como se define en su especificación, la devolución falla y termina este algoritmo.
  4.   
    
respondido por el apsillers 16.10.2013 - 19:15
fuente

Lea otras preguntas en las etiquetas