Digamos que você não queira que outros sites "enquadrem" seu site em <iframe>
:
<iframe src="http://example.org"></iframe>
Então você insere JavaScript anti-framing e frame-busting em todas as suas páginas:
/* break us out of any containing iframes */
if (top != self) { top.location.replace(self.location.href); }
Excelente! Agora você "quebra" ou interrompe automaticamente qualquer iframe contendo. Exceto por um pequeno problema.
Como se vê, seu código de interrupção de quadros pode ser impedido , como mostrado aqui :
<script type="text/javascript">
var prevent_bust = 0
window.onbeforeunload = function() { prevent_bust++ }
setInterval(function() {
if (prevent_bust > 0) {
prevent_bust -= 2
window.top.location = 'http://example.org/page-which-responds-with-204'
}
}, 1)
</script>
Este código faz o seguinte:
- incrementa um contador toda vez que o navegador tenta navegar para fora da página atual, por meio do
window.onbeforeunload
manipulador de eventos - configura um timer que dispara a cada milissegundo via
setInterval()
e, se o contador for incrementado, altera o local atual para um servidor de controle do invasor - esse servidor exibe uma página com o código de status HTTP 204 , que não faz com que o navegador navegue em qualquer lugar
Minha pergunta é - e isso é mais um quebra-cabeça de JavaScript do que um problema real - como você pode derrotar o imbecil que destrói os quadros?
Eu tive alguns pensamentos, mas nada funcionou nos meus testes:
- tentar limpar o
onbeforeunload
evento viaonbeforeunload = null
não teve efeito - adicionar e
alert()
interromper o processo avisa o usuário que isso está acontecendo, mas não interfere no código; clicar em OK permite que a interrupção continue normalmente - Não consigo pensar em nenhuma maneira de limpar o
setInterval()
temporizador
Eu não sou muito programador de JavaScript, então aqui está o meu desafio para você: ei, imbecil, você pode bloquear o imbecil?
example.org
o especificado na RFC 2606 ietf.org/rfc/rfc2606.txt