Política de mesma origem
Você não pode acessar um <iframe>
com origem diferente usando JavaScript, seria uma enorme falha de segurança se você pudesse fazê-lo. Para os navegadores de política de mesma origem, os scripts de bloqueio tentam acessar um quadro com uma origem diferente .
A origem é considerada diferente se pelo menos uma das seguintes partes do endereço não for mantida:
<protocol>://<hostname>:<port>/...
Protocolo , nome do host e porta devem ser iguais ao seu domínio, se você quiser acessar um quadro.
NOTA: Sabe-se que o Internet Explorer não segue rigorosamente esta regra, consulte aqui para obter detalhes.
Exemplos
Aqui está o que aconteceria ao tentar acessar os seguintes URLs em http://www.example.com/home/index.html
URL RESULT
http://www.example.com/home/other.html -> Success
http://www.example.com/dir/inner/another.php -> Success
http://www.example.com:80 -> Success (default port for HTTP)
http://www.example.com:2251 -> Failure: different port
http://data.example.com/dir/other.html -> Failure: different hostname
https://www.example.com/home/index.html:80 -> Failure: different protocol
ftp://www.example.com:21 -> Failure: different protocol & port
https://google.com/search?q=james+bond -> Failure: different protocol, port & hostname
Gambiarra
Embora a política de mesma origem impeça os scripts de acessar o conteúdo de sites com uma origem diferente, se você possui as duas páginas, poderá solucionar esse problema usando window.postMessage
e seu message
evento relativo para enviar mensagens entre as duas páginas, desta forma:
Na sua página principal:
let frame = document.getElementById('your-frame-id');
frame.contentWindow.postMessage(/*any variable or object here*/, 'http://your-second-site.com');
O segundo argumento para postMessage()
pode ser '*'
para não indicar preferência sobre a origem do destino. Uma origem de destino sempre deve ser fornecida quando possível, para evitar a divulgação dos dados que você envia para qualquer outro site.
No seu <iframe>
(contido na página principal):
window.addEventListener('message', event => {
// IMPORTANT: check the origin of the data!
if (event.origin.startsWith('http://your-first-site.com')) {
// The data was sent from your site.
// Data sent with postMessage is stored in event.data:
console.log(event.data);
} else {
// The data was NOT sent from your site!
// Be careful! Do not use it. This else branch is
// here just for clarity, you usually shouldn't need it.
return;
}
});
Esse método pode ser aplicado nas duas direções , criando também um ouvinte na página principal e recebendo respostas do quadro. A mesma lógica também pode ser implementada em pop-ups e basicamente qualquer nova janela gerada pela página principal (por exemplo, usando window.open()
) também, sem nenhuma diferença.
Desativando a política de mesma origem no seu navegador
Já existem boas respostas sobre esse tópico (acabei de encontrá-las no Google). Portanto, para os navegadores onde isso for possível, vincularemos a resposta relativa. No entanto, lembre-se de que desativar a política de mesma origem afetará apenas o seu navegador . Além disso, a execução de um navegador com configurações de segurança da mesma origem desabilitadas concede a qualquer site acesso a recursos de origem cruzada, portanto , é muito inseguro e NUNCA deve ser feito se você não souber exatamente o que está fazendo (por exemplo, fins de desenvolvimento) .
Access-Control-Allow-Origin
não se aplica aos iFrames, apenas aos XHRs, Fonts, WebGL ecanvas.drawImage
. Eu acredito quepostMessage
é a única opção.