2012-08-28 25 views
6

inadvertidamente me escribió una llamada AJAX entre dominios a NextBus (con jQuery):¿Por qué funciona realmente esta llamada ajax de dominios cruzados?

$.ajax({ 
     url: 'http://webservices.nextbus.com/service/publicXMLFeed?command=predictions&a=sf-muni&r=1&s=6294', 
     dataType: 'xml', 
     success: function(data) { 
      do_stuff(); 
     } 
}); 

cosa es que funciona en todos los navegadores, a pesar de venir de un dominio diferente. Dada la política de origen único, , ¿por qué funciona esto realmente?

La página está aquí: http://sftransitfirst.org/F/, seleccionando una parada desde el desplegable activa el ajax.

Como era de esperar, hacer una llamada similar al Google Maps API Web Services falla con el familiar Origin ... is not allowed by Access-Control-Allow-Origin (y no es compatible con jsonp).

+0

Creo que es porque la URL de Google es "https"? No estoy seguro si –

+8

El conjunto de encabezados de respuesta de esa URL contiene 'Access-Control-Allow-Origin: *'. [CORS] (https://secure.wikimedia.org/wikipedia/en/wiki/Cross-origin_resource_sharing) –

+1

@Rob Solo escríbalo como respuesta;) – Christoph

Respuesta

11

Deben haber permitido explícitamente el acceso a varios dominios, con algo de esta manera:

<?php header('Access-Control-Allow-Origin: *'); ?> 

O con .htaccess:

<ifModule mod_headers.c> 
    Header set Access-Control-Allow-Origin: * 
</ifModule> 
+0

Pensé que el SOP era una medida de seguridad del lado del cliente (navegador) , aunque. Permitir que el servicio web remoto anule la política parece frustrar el propósito, ¿no es así? es decir, que no debe confiar en ningún recurso antiguo de otro dominio. – carillonator

+0

@carillonator En primer lugar, SOP impide que las secuencias de comandos de diferentes orígenes accedan a los métodos y propiedades de los demás, por ejemplo, evitando que un script de terceros lea las cookies que su script ha establecido. – Christoph

+1

@carillonator Puedo ver dónde podría parecer un riesgo de seguridad. Pero este tipo de configuración solo (debería) estar habilitada en sitios que quieren que haya contenido accesible (p. Ej., Twitter). Y desde el punto de vista de la seguridad, el sitio que está viendo también debería realizar una llamada a ese sitio que tiene permitido el origen, todo permitido. Por lo tanto, desde el punto de vista de la preocupación de los "hackers", el acceso ya sería necesario para insertar la llamada a otro sitio o habilitar el acceso en la raíz, ya sea que la seguridad de los sitios ya se haya visto gravemente comprometida. –

5

Muchas API web modernos permiten Cross-Domain Resource Sharing (CORS). CORS es un método para que los sitios web dejen voluntariamente sus páginas disponibles para scripts entre dominios. El encabezado HTTP Access-Control-Allow-Origin del servidor señala a su navegador web que está bien permitir que el script acceda a la página con Ajax, incluso si el script se ejecuta en un origen diferente. Si el servidor no sirve encabezados CORS, su navegador aplicará el SOP como de costumbre.

La mayoría de las API eligen exponer sus páginas en scripts entre dominios porque saben que prácticamente todos sus usuarios querrán poder acceder a la API a través de Ajax desde sus propios dominios.

Cuestiones relacionadas