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.postMessagee seu messageevento 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-Originnão se aplica aos iFrames, apenas aos XHRs, Fonts, WebGL ecanvas.drawImage. Eu acredito quepostMessageé a única opção.