Tentativa insegura de JavaScript para acessar o frame com URL

112

Estou recebendo o erro a seguir quando tento definir um valor hash para o url pai do iframe que contém outro url de domínio:

JavaScript não seguro tenta acessar o frame com URL "URL1" do frame com URL "URL2". Domínios, protocolos e portas devem corresponder.

Como posso resolver este problema?

Atul
fonte
3
Por favor, adicione mais detalhes, trechos de código, mensagem de erro, estrutura que você usa .. Mais detalhamento, mais detalhes ..
fifigyuri
5
E quando você implementa g + 1, facebook like ou shre e plug-ins sociais do Twitter que carregam em iframes e geram o mesmo erro?
A questão é POR QUE os scripts do Facebook e do Google estão TENTANDO acessar os elementos do meu site.
sergio

Respostas:

124

A partir de um documento filho de origem diferente, você não tem permissão para acessar a location.hashpropriedade da janela superior , mas tem permissão para definir a locationprópria propriedade.

Isso significa que, dado que a localização da janela superior é http://example.com/page/, em vez de

parent.location.hash = "#foobar";

você precisa saber a localização dos pais e fazer

parent.location = "http://example.com/page/#foobar";

Como o recurso não é navegado, isso funcionará conforme o esperado, alterando apenas a parte hash do url.

Se você estiver usando isso para comunicação entre domínios, eu recomendaria usar easyXDM .

Sean Kinsey
fonte
13
Ninguém marcou esta como a resposta e ainda assim tem 60 votos positivos. Deve haver um emblema para isso.
zachzurn
35
Qual seria o nome do emblema? "Respondeu a uma pessoa preguiçosa"
nzifnab
1
Olá @atul, seja gentil e marque esta resposta como a melhor. Respeite as convenções que permitem que todos nós nos beneficiemos do conhecimento de outros ...
Clint Eastwood
13

Crossframe-Scripting não é possível quando os dois quadros têm domínios diferentes -> Segurança.

Veja isto: http://javascript.about.com/od/reference/a/frame3.htm

Agora, para responder à sua pergunta: não há solução ou solução alternativa, você simplesmente deve verificar o design do seu site por que deve haver dois frames de domínios diferentes que alteram o URL do outro.

EvilMM
fonte
82
Este é um requisito frequente quando se incorpora um aplicativo de terceiros em seu site, especialmente quando serviços da Web e similares não são uma opção.
Jacques
9

Eu estava recebendo a mesma mensagem de erro quando tentei mudar o domínio para iframe.src.

Para mim, a resposta foi mudar o iframe.src para uma url no MESMO domínio, mas que na verdade era uma página de redirecionamento em html para o domínio desejado. O outro domínio então apareceu em meu iframe sem erros.

Funcionou como um encanto. :)

Tommy
fonte
você poderia elaborar mais sobre o que exatamente você fez aqui?
Devin G Rhode
seria muito útil se você pudesse explicar brevemente.
Madhusudhan
2
Não funciona no Chrome mais recente: não verifica o parâmetro src, mas o URL real carregado. Portanto, o truque de redirecionamento, infelizmente, não ajuda em nada :-(
lucaferrario
3
Eu acredito que o que Tommy está se referindo é um proxy do lado do servidor. Consulte, por exemplo, benalman.com/projects/php-simple-proxy ou developer.yahoo.com/javascript/howto-proxy.html ou google.com/… ou a solução de René de Kat em stackoverflow.com/a/11224975/27938
Oskar Austegard
Isso é legal. Mas isso apenas ilustra como geralmente é trivial contornar isso. Ok, vamos supor que eu seja um hacker mal-intencionado e quero executar ataques de script entre domínios. É provável que eu conheça essas ferramentas e as use. No que diz respeito às correções de segurança do navegador, isso é facilmente tão retardado quanto o IE, não permitindo que você execute Javascript localmente sem um aviso. Não resolve nenhum problema. Cria vários novos.
Yitzhak
6

Uma solução poderia ser usar um arquivo local que recupera o conteúdo remoto

remoteInclude.php

<?php
$url = $_GET['url'];
$contents = file_get_contents($url);
echo $contents;

O HTML

<iframe frameborder="1" id="frametest" src="/remoteInclude.php?url=REMOTE_URL_HERE"></iframe>
<script>
    $("#frametest").load(function (){       
    var contents =$("#frametest").contents();
});


fonte
1
Isso abre a porta para vulnerabilidades de cross-site scripting. Um exemplo de possível ataque: 1. Eu crio uma página em myevilserver.com que se parece com o seu site, incluindo um formulário de login que retorna para myevilserver.com 2. Eu envio um boletim informativo falso para seus usuários com um link para https: // yoursite.com/remoteInclude.php?url=myevilserver.com 3. Eles veem um formulário de login no seu site que capturo no meu servidor.
EricP
2
Uma solução possível é fazer com que remoteInclude.php verifique todos os urls em relação a uma lista pré-aprovada de domínios.
EricP
Isso não resolve os problemas de vulnerabilidade de script entre sites. Não há absolutamente nada que eu possa fazer com Javascript em um site externo que não possa fazer do lado do servidor. Tudo isso atrapalha o próprio navegador e torna os aplicativos da web menos úteis com a introdução de uma etapa extra. Você ainda pode fazer tudo isso se carregar por meio do ajax, reescrever links e postar de volta. Se isso não funcionar, faça rpc remoto por meio de php ou qualquer outro idioma. É um absurdo que isso seja um problema até para o codificador médio.
Yitzhak
3

Descobri que usar a versão XFBML do botão Curtir do Facebook em vez da versão HTML5 corrigiu esse problema. Adicione o código abaixo onde deseja que o botão apareça:

<div id="fb-root"></div>
<script>(function (d, s, id) {
    var js, fjs = d.getElementsByTagName(s)[0];
    if (d.getElementById(id)) return;
    js = d.createElement(s); js.id = id;
    js.src = "//connect.facebook.net/en_GB/all.js#xfbml=1";
    fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));</script>

<fb:like send="true" layout="button_count" width="50" show_faces="false" font="arial"></fb:like>

Em seguida, adicione isto à sua tag HTML:

 xmlns:fb="http://ogp.me/ns/fb#"
Luke Alderton
fonte
2
O que o Facebook tem a ver com essa questão?
Kukks
16
Porque você também recebe esse erro nos botões de curtir do Facebook e encontrei esta página quando procurava uma resposta, então pensei que outras pessoas poderiam precisar da resposta.
Luke Alderton
1

O problema é que mesmo se você criar um proxy ou carregar o conteúdo e injetá-lo como se fosse local, todos os scripts que esse conteúdo definir serão carregados de outro domínio e causar problemas entre domínios.

user2345833
fonte