O document.domain
método
Observe que este é um método iframe que define o valor de document.domain como um sufixo do domínio atual. Se fizer isso, o domínio mais curto será usado para verificações de origem subsequentes. Por exemplo, suponha que um script no documento em http://store.company.com/dir/other.html
execute a seguinte instrução:
document.domain = "company.com";
Após a execução dessa instrução, a página passaria na verificação de origem com http://company.com/dir/page.html
. No entanto, pelo mesmo raciocínio, company.com não poderia definir document.domain
a othercompany.com
.
Com esse método, você poderá executar o javascript de um iframe originado em um subdomínio em uma página originada no domínio principal. Este método não é adequado para recursos entre domínios, pois navegadores como o Firefox não permitem alterar o domínio document.domain
para um domínio completamente estranho.
Fonte: https://developer.mozilla.org/en/Same_origin_policy_for_JavaScript
O método de compartilhamento de recursos de origem cruzada
O compartilhamento de recursos de origem cruzada (CORS) é um rascunho de trabalho do W3C que define como o navegador e o servidor devem se comunicar ao acessar fontes de origens. A idéia básica por trás do CORS é usar cabeçalhos HTTP personalizados para permitir que o navegador e o servidor saibam o suficiente um sobre o outro para determinar se a solicitação ou resposta deve ter êxito ou falhar.
Para uma solicitação simples, que usa um GET
ou POST
sem cabeçalhos personalizados e cujo corpo é text/plain
, a solicitação é enviada com um cabeçalho extra chamado Origin
. O cabeçalho Origin contém a origem (protocolo, nome de domínio e porta) da página solicitante, para que o servidor possa determinar facilmente se deve ou não servir uma resposta. Um Origin
cabeçalho de exemplo pode ser assim:
Origin: http://www.stackoverflow.com
Se o servidor decidir que a solicitação deve ser permitida, ele envia um Access-Control-Allow-Origin
cabeçalho ecoando a mesma origem que foi enviada ou *
se é um recurso público. Por exemplo:
Access-Control-Allow-Origin: http://www.stackoverflow.com
Se esse cabeçalho estiver ausente ou as origens não corresponderem, o navegador não permitirá a solicitação. Se tudo estiver bem, o navegador processará a solicitação. Observe que nem as solicitações nem as respostas incluem informações sobre cookies.
A equipe da Mozilla sugere em seu post sobre o CORS que você deve verificar a existência da withCredentials
propriedade para determinar se o navegador suporta o CORS via XHR. Você pode associar a existência do XDomainRequest
objeto a todos os navegadores:
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();
}
Observe que, para que o método CORS funcione, você precisa ter acesso a qualquer tipo de mecânico de cabeçalho do servidor e não pode simplesmente acessar qualquer recurso de terceiros.
Fonte: http://www.nczonline.net/blog/2010/05/25/cross-domain-ajax-with-cross-origin-resource-sharing/
O window.postMessage
método
window.postMessage
, quando chamado, faz com que um MessageEvent
seja despachado na janela de destino quando qualquer script pendente que deve ser executado for concluído (por exemplo, os manipuladores de eventos restantes, se window.postMessage
for chamado de um manipulador de eventos, tempos limite pendentes definidos anteriormente, etc.). A MessageEvent
tem o tipo de mensagem, uma data
propriedade que está definido para o valor da cadeia do primeiro argumento fornecido para window.postMessage
, uma origin
propriedade que corresponde à origem do documento principal na janela chamando window.postMessage
no momento window.postMessage
foi chamado, e uma source
propriedade que é a janela de qual window.postMessage
é chamado.
Para usar window.postMessage
, um ouvinte de evento deve ser anexado:
// Internet Explorer
window.attachEvent('onmessage',receiveMessage);
// Opera/Mozilla/Webkit
window.addEventListener("message", receiveMessage, false);
E uma receiveMessage
função deve ser declarada:
function receiveMessage(event)
{
// do something with event.data;
}
O iframe externo também deve enviar eventos corretamente via postMessage
:
<script>window.parent.postMessage('foo','*')</script>
Qualquer janela pode acessar esse método em qualquer outra janela, a qualquer momento, independentemente do local do documento na janela, para enviar uma mensagem. Conseqüentemente, qualquer ouvinte de evento usado para receber mensagens deve primeiro verificar a identidade do remetente da mensagem, usando a origem e possivelmente as propriedades de origem. Isso não pode ser subestimado: a falha em verificar as propriedades origin
e possivelmente source
ativa os ataques de script entre sites.
Fonte: https://developer.mozilla.org/en/DOM/window.postMessage