2012-03-15 13 views
52

Estoy desarrollando una API web JSON/REST, para la cual deseo específicamente que los sitios web de terceros puedan llamar a mi servicio a través de AJAX. Por lo tanto, mi servicio está enviando el famoso encabezado CORS:¿Cuándo es seguro activar CORS?

Access-Control-Allow-Origin: * 

que permite a los sitios de terceros que llamar a mi servicio a través de AJAX. Todo bien hasta ahora.

Sin embargo, una subsección de mi API web no es pública y requiere autenticación (material bastante estándar con OAuth y una cookie access_token). ¿Es seguro habilitar CORS en esta parte de mi sitio también?

Por un lado, sería genial si los sitios web de terceros pudieran tener clientes jajax que también interactúen con esta parte de mi servicio. Sin embargo, la razón de que haya una misma política de origen en primer lugar es que esto podría ser riesgoso. No desea que ningún sitio web que visite después pueda acceder a su contenido privado.

El escenario que me da miedo es que un usuario inicie sesión en mi API web, ya sea en el sitio web oa través de un sitio web en el que confía, y se olvida de cerrar la sesión. ¿Permitirá esto que cada otro sitio web que visita después tenga acceso a su contenido privado utilizando la sesión existente?

Así que mis preguntas:

  • ¿Alguna vez es segura para permitir CORS sobre el contenido no pública?
  • Si un servidor CORS habilitado establece un session_token a través de una cookie, ¿se guardará esta cookie en el dominio del servidor CORS o del servidor principal de la página web?
+2

Tenga en cuenta que solo puede enviar los encabezados CORS a los recursos a los que desea que otros accedan desde otros orígenes. Y también podría limitar el acceso de CORS a solo los orígenes de los que espera el uso. –

+1

Idealmente, quisiera que todos los recursos sean accesibles desde cualquier origen, si la seguridad lo permite. Depende del usuario proporcionar credenciales válidas. Solo quiero asegurarme de no abrir la puerta a ataques de scripts cruzados desde sitios web maliciosos. – Jeroen

Respuesta

29

En respuesta a su segunda pregunta (Si un servidor CORS habilitado establece un session_token a través de una cookie ...?), La cookie se guarda bajo el dominio del servidor CORS. El código JS de la página web principal no puede acceder a la cookie, ni siquiera a través del document.cookie. La cookie solo se envía al servidor cuando se establece la propiedad .withCredentials, e incluso entonces, solo se acepta cuando el servidor establece el encabezado Access-Control-Allow-Credentials.

Su primera pregunta es un poco más abierta. Es bastante seguro, pero hay formas de eludir las cosas. Por ejemplo, un atacante podría usar una técnica de envenenamiento de DNS para hacer que una solicitud de verificación previa llegue al servidor real, pero envíe la solicitud CORS real al servidor no autorizado.Aquí están algunos recursos más para la seguridad CORS:

Por último, su preocupación es por ahí dando cualquier acceso web a sus datos CORS. Para protegerse de esto, no debe usar el encabezado Access-Control-Allow-Origin: *. En su lugar, debe repetir el valor de origen del usuario. Por ejemplo:

Access-Control-Allow-Origin: http://www.example.com 

Esta cabecera sólo permitirá http://www.example.com acceder a los datos de respuesta.

+2

¿Puedes aclarar cómo el eco del encabezado 'origen' se agrega a la seguridad? ¿Pensaría que cualquier sitio web/script malicioso podría establecer fácilmente este encabezado también? ¿O te refieres a mantener algún tipo de lista blanca? – Jeroen

+3

Sí, mantener una lista blanca de orígenes aceptables es una solución. Otra es vincular una identificación de sesión de usuario a un origen particular. De esta forma, si un origen diferente de alguna manera reproduce la solicitud con las credenciales del usuario, fallará. – monsur

+0

Creo que quiere decir que un atacante interceptaría la verificación previa, no la solicitud real. También tenga en cuenta que los GET no son pre-flighted. – csauve

15

La intención de CORS es permitir solicitudes de origen cruzado para las solicitudes de XHR al tiempo que le da al servidor la autoridad para especificar qué origen tiene acceso a cada recurso. En particular, CORS introdujo el campo de encabezado Origen que permite que el servidor distinga las solicitudes de XHR regulares y posibles. El usuario no puede establecer o cambiar este campo de encabezado, pero el navegador lo configura para solicitudes XHR.

Así que si tiene una API que está diseñada para ser utilizada solo por XHR, puede (y debe) requerir que la solicitud se ajuste a CORS. Especialmente si las solicitudes también pueden modificar el estado en su servidor, ya que de lo contrario sería vulnerable a CSRF.

Tenga en cuenta que los ataques CSRF son posibles independientemente de CORS utilizando otros métodos para falsificar solicitudes GET y POST. CORS solo permite acceder a la respuesta del servidor de solicitudes XHR con JavaScript si el servidor lo permite.