2012-08-28 13 views
6

ho inavvertitamente scritto una chiamata AJAX cross-domain di NextBus (con jQuery):Perché questa chiamata ajax su più domini funziona davvero?

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

Il fatto è, funziona su tutti i browser, pur provenendo da un dominio diverso. Data la politica di origine singola, , perché funziona effettivamente?

La pagina è qui: http://sftransitfirst.org/F/, la selezione di una fermata dal pulsante di avvio fa scattare l'ajax.

Come previsto, effettuare una chiamata simile a Google Maps API Web Services non riesce con il familiare Origin ... is not allowed by Access-Control-Allow-Origin (e non supporta jsonp).

+0

Penso che sia perché l'URL di Google è "https"? Non sei sicuro che –

+8

Il set di intestazioni di risposta da quell'URL contiene 'Access-Control-Allow-Origin: *'. [CORS] (https://secure.wikimedia.org/wikipedia/en/wiki/Cross-origin_resource_sharing) –

+1

@Rob Basta scriverlo come risposta;) – Christoph

risposta

11

Devono aver esplicitamente consentito l'accesso cross-domain, con qualcosa di questa maniera:

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

O con .htaccess:

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

Ho pensato che il SOP fosse una misura di sicurezza lato client (browser) , anche se. Consentire al webservice remoto di ignorare la politica sembra sconfiggere lo scopo, vero? Ad esempio, non dovresti fidarti di nessuna vecchia risorsa di un altro dominio. – carillonator

+0

@carillonator In primo luogo, SOP impedisce agli script di origini diverse di accedere a ogni altro metodo e proprietà, ad es. impedendo a uno script di terze parti di leggere i cookie impostati dallo script. – Christoph

+1

@carillonator Riesco a vedere dove sembrerebbe un rischio per la sicurezza. Ma questo tipo di impostazione sarà (dovrebbe) essere abilitato solo sui siti che desiderano che il contenuto sia accessibile (ad esempio, twitter). E dal punto di vista della sicurezza, il sito che stai visualizzando dovrebbe anche essere chiamato a quel sito che ha permesso l'origine consentita. Quindi, da un punto di vista delle "preoccupazioni degli hacker", l'accesso sarebbe già necessario per inserire la chiamata in un altro sito o abilitare l'accesso nella radice, o la sicurezza dei siti è già stata gravemente compromessa. –

5

molte API web moderne consentono Cross-Domain Resource Sharing (CORS). CORS è un metodo con cui i siti Web mettono volontariamente a disposizione le proprie pagine per gli script tra domini. L'intestazione HTTP Access-Control-Allow-Origin dal server segnala al browser Web che è consentito consentire allo script di accedere alla pagina con Ajax, anche se lo script è in esecuzione su un'origine diversa. Se il server non pubblica intestazioni CORS, il tuo browser applicherà la SOP come al solito.

La maggior parte delle API sceglie di esporre le proprie pagine agli script tra domini perché sanno che virtualmente tutti i loro utenti vorranno poter accedere all'API tramite Ajax dai propri domini.

Problemi correlati