Il document.domainmetodo
Si noti che questo è un metodo iframe che imposta il valore di document.domain su un suffisso del dominio corrente. In tal caso, il dominio più breve viene utilizzato per i successivi controlli dell'origine. Ad esempio, supponiamo che uno script nel documento http://store.company.com/dir/other.htmlesegua la seguente istruzione:
document.domain = "company.com";
Dopo l'esecuzione dell'istruzione, la pagina passerà il controllo dell'origine con http://company.com/dir/page.html. Tuttavia, lo stesso ragionamento, company.com non poteva impostare document.domain a othercompany.com.
Con questo metodo, ti sarà permesso di estrarre javascript da un iframe proveniente da un sottodominio su una pagina proveniente dal dominio principale. Questo metodo non è adatto a risorse tra domini poiché browser come Firefox non ti permetteranno di passare document.domaina un dominio completamente estraneo.
Fonte: https://developer.mozilla.org/en/Same_origin_policy_for_JavaScript
Il metodo di condivisione delle risorse tra le origini
Cross-Origin Resource Sharing (CORS) è una bozza di lavoro del W3C che definisce come il browser e il server devono comunicare quando accedono alle origini attraverso le origini. L'idea di base di CORS è quella di utilizzare le intestazioni HTTP personalizzate per consentire sia al browser che al server di conoscersi a vicenda per determinare se la richiesta o la risposta deve avere esito positivo o negativo.
Per una semplice richiesta, che utilizza una GETo POSTsenza intestazioni personalizzate e il cui corpo è text/plain, la richiesta viene inviata con un'intestazione aggiuntiva chiamata Origin. L'intestazione Origin contiene l'origine (protocollo, nome di dominio e porta) della pagina richiedente in modo che il server possa determinare facilmente se deve servire o meno una risposta. OriginUn'intestazione di esempio potrebbe apparire così:
Origin: http://www.stackoverflow.com
Se il server decide che la richiesta deve essere consentita, invia Access-Control-Allow-Originun'intestazione che riecheggia la stessa origine che è stata inviata o *se si tratta di una risorsa pubblica. Per esempio:
Access-Control-Allow-Origin: http://www.stackoverflow.com
Se questa intestazione è mancante o le origini non corrispondono, il browser non accetta la richiesta. Se tutto va bene, il browser elabora la richiesta. Si noti che né le richieste né le risposte includono informazioni sui cookie.
Il team di Mozilla suggerisce nei loro post su CORS che è necessario verificare l'esistenza della withCredentials proprietà per determinare se il browser supporta CORS tramite XHR. È quindi possibile associare l'esistenza XDomainRequestdell'oggetto per coprire tutti i browser:
function createCORSRequest(method, url){
var xhr = new XMLHttpRequest();
if ("withCredentials" in xhr){
xhr.open(method, url, true);
} else if (typeof XDomainRequest != "undefined"){
xhr = new XDomainRequest();
xhr.open(method, url);
} else {
xhr = null;
}
return xhr;
}
var request = createCORSRequest("get", "http://www.stackoverflow.com/");
if (request){
request.onload = function() {
// ...
};
request.onreadystatechange = handler;
request.send();
}
Nota per far funzionare il metodo CORS, devi avere accesso a qualsiasi tipo di meccanico dell'intestazione del server e non puoi semplicemente accedere a qualsiasi risorsa di terze parti.
Fonte: http://www.nczonline.net/blog/2010/05/25/cross-domain-ajax-with-cross-origin-resource-sharing/
Il window.postMessagemetodo
window.postMessage, quando viene chiamato, provoca la MessageEventspedizione di a nella finestra di destinazione al completamento di qualsiasi script in sospeso che deve essere eseguito (ad es. i gestori di eventi rimanenti se window.postMessagechiamati da un gestore di eventi, i timeout in sospeso impostati in precedenza, ecc.). Il MessageEventha il tipo di messaggio, una dataproprietà che è impostato al valore di stringa del primo argomento fornito window.postMessage, una originstruttura corrispondente all'origine del documento principale nella finestra chiamante window.postMessageal momento window.postMessageè stato chiamato, e una sourceproprietà che è la finestra da che window.postMessagesi chiama.
Per utilizzare window.postMessage, è necessario allegare un listener di eventi:
// Internet Explorer
window.attachEvent('onmessage',receiveMessage);
// Opera/Mozilla/Webkit
window.addEventListener("message", receiveMessage, false);
E una receiveMessagefunzione deve essere dichiarata:
function receiveMessage(event)
{
// do something with event.data;
}
L'iframe fuori sede deve anche inviare correttamente gli eventi tramite postMessage:
<script>window.parent.postMessage('foo','*')</script>
Qualsiasi finestra può accedere a questo metodo su qualsiasi altra finestra, in qualsiasi momento, indipendentemente dalla posizione del documento nella finestra, per inviargli un messaggio. Di conseguenza, qualsiasi listener di eventi utilizzato per ricevere messaggi deve prima verificare l'identità del mittente del messaggio, utilizzando l'origine e possibilmente le proprietà di origine. Questo non può essere sottovalutato: la mancata verifica delle proprietà origine possibilmente sourceabilita gli attacchi di scripting tra siti.
Fonte: https://developer.mozilla.org/en/DOM/window.postMessage