Alguns sites têm código para "quebrar" os IFRAME
gabinetes, o que significa que, se uma página A
for carregada como uma IFRAME
página pai dentro de uma página pai, P
algum Javascript A
redirecionará a janela externa para A
.
Normalmente, esse Javascript se parece com isso:
<script type="text/javascript">
if (top.location.href != self.location.href)
top.location.href = self.location.href;
</script>
Minha pergunta é: como autor da página pai P
e não autor da página interna A
, como posso evitar A
essa interrupção?
PS Parece-me que deveria ser uma violação de segurança entre sites, mas não é.
javascript
html
iframe
Jason Cohen
fonte
fonte
Respostas:
Tente usar a propriedade onbeforeunload, que permitirá ao usuário escolher se deseja navegar para fora da página.
Exemplo: https://developer.mozilla.org/en-US/docs/Web/API/Window.onbeforeunload
No HTML5, você pode usar a propriedade sandbox. Por favor, veja a resposta de Pankrat abaixo. http://www.html5rocks.com/en/tutorials/security/sandboxed-iframes/
fonte
postMessage
. Isso não representa um risco à segurança, mas alguém pode querer saber que esse recurso existe quando vê seu comentário. :)sandbox
.Com HTML5, o atributo da caixa de areia iframe foi adicionado. No momento da redação, isso funciona no Chrome, Safari, Firefox e versões recentes do IE e Opera, mas faz praticamente o que você deseja:
Se você deseja permitir redirecionamentos de nível superior, especifique
sandbox="allow-top-navigation"
.fonte
sandbox
, não permite o Flash ou qualquer outro tipo de objeto no quadro em área restrita, tornando osandbox
recurso inútil em muitos casos.Eu uso sandbox = "..."
A navegação superior é o que você deseja impedir; portanto, deixe isso de fora e não será permitido. Qualquer coisa deixada de fora será bloqueada
ex.
fonte
Depois de ler a especificação do w3.org . Encontrei a propriedade sandbox.
Você pode definir
sandbox=""
, o que impede o redirecionamento do iframe. Dito isto, ele também não redirecionará o iframe. Você perderá o clique essencialmente.Exemplo aqui: http://jsfiddle.net/ppkzS/1/
Exemplo sem sandbox: http://jsfiddle.net/ppkzS/
fonte
Eu sei que já faz muito tempo desde que a pergunta foi feita, mas aqui está a minha versão aprimorada que aguardará 500 ms por qualquer chamada subseqüente apenas quando o iframe for carregado.
e
onload="frameLoad()"
eonreadystatechange="frameLoad();"
tem de ser adicionado ao quadro ou iframe.fonte
Eu encontrei alguns hacks úteis sobre isso:
Usando JS, como posso impedir que Iframes filho redirecionem ou pelo menos avise os usuários sobre o redirecionamento
http://www.codinghorror.com/blog/2009/06/we-done-been-framed.html
http://coderrr.wordpress.com/2009/02/13/preventing-frame-busting-and-click-jacking-ui-redressing/
fonte
Como a página que você carrega dentro do iframe pode executar o código "breakout" com um setInterval, onbeforeunload pode não ser tão prático, pois pode deixar o usuário com 'Tem certeza de que deseja sair?' diálogos.
Há também o atributo de segurança iframe, que funciona apenas no IE & Opera
:(
fonte
No meu caso, quero que o usuário visite a página interna para que o servidor veja seu IP como visitante. Se eu usar a técnica de proxy php, acho que a página interna verá meu ip do servidor como visitante, portanto não é bom. A única solução que obtive até agora é a carga antes da carga. Coloque isso na sua página:
Isso funciona tanto no firefox quanto no que eu testei. você encontrará versões usando algo como evt.return (tanto faz) porcaria ... que não funciona no firefox.
fonte
Ao fazer isso, você poderá controlar qualquer ação da página emoldurada, que não poderá. A política de origem do mesmo domínio se aplica.
fonte