Il document.domain
metodo
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.html
esegua 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.domain
a 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 GET
o POST
senza 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. Origin
Un'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-Origin
un'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 XDomainRequest
dell'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.postMessage
metodo
window.postMessage
, quando viene chiamato, provoca la MessageEvent
spedizione 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.postMessage
chiamati da un gestore di eventi, i timeout in sospeso impostati in precedenza, ecc.). Il MessageEvent
ha il tipo di messaggio, una data
proprietà che è impostato al valore di stringa del primo argomento fornito window.postMessage
, una origin
struttura corrispondente all'origine del documento principale nella finestra chiamante window.postMessage
al momento window.postMessage
è stato chiamato, e una source
proprietà che è la finestra da che window.postMessage
si 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 receiveMessage
funzione 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à origin
e possibilmente source
abilita gli attacchi di scripting tra siti.
Fonte: https://developer.mozilla.org/en/DOM/window.postMessage