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?
javascript
html
iframe
framebusting
Jeff Atwood
fonte
fonte
example.org
o especificado na RFC 2606 ietf.org/rfc/rfc2606.txtRespostas:
Não tenho certeza se isso é viável ou não - mas se você não pode quebrar o quadro, por que não exibir apenas um aviso. Por exemplo, se sua página não for a "página superior", crie um método setInterval que tente quebrar o quadro. Se, após 3 ou 4 tentativas, sua página ainda não estiver na página inicial - crie um elemento div que cubra a página inteira (caixa modal) com uma mensagem e um link como ...
Não é o melhor, mas não vejo como eles conseguiram sair dessa.
fonte
document.write("");
(depois de ter estabelecido que está sendo enquadradoFWIW, a maioria dos navegadores atuais oferece suporte à diretiva X-Frame-Options: negar , que funciona mesmo quando o script está desativado.
IE8:
http://blogs.msdn.com/ie/archive/2009/01/27/ie8-security-part-vii-clickjacking-defenses.aspx
Firefox (3.6.9)
https://bugzilla.mozilla.org/show_bug.cgi?id=475530
https://developer.mozilla.org/en/The_X-FRAME-OPTIONS_response_header
Chrome / Webkit
http://blog.chromium.org/2010/01/security-in-depth-new-security-features.html
http://trac.webkit.org/changeset/42333
fonte
Usamos a seguinte abordagem em um de nossos sites em http://seclab.stanford.edu/websec/framebusting/framebust.pdf
fonte
Achei isso e parece funcionar pelo menos no Firefox e no navegador Opera.
fonte
onbeforeunload
manipuladores, não apenas o que está em cima!Considerando o padrão HTML5 atual que introduziu a sandbox para iframe, todos os códigos de interrupção de quadros fornecidos nesta página podem ser desativados quando o invasor usa a sandbox porque restringe o iframe do seguinte:
Consulte: http://www.whatwg.org/specs/web-apps/current-work/multipage/the-iframe-element.html#attr-iframe-sandbox
Agora, considere o invasor usado o seguinte código para hospedar seu site no iframe:
Então, todo o código de bloqueio de quadro JavaScript falhará.
Depois de verificar todo o código de barramento de quadro, somente essa defesa funciona em todos os casos:
proposto originalmente por Gustav Rydstedt, Elie Bursztein, Dan Boneh e Collin Jackson (2010)
fonte
Depois de ponderar isso por um tempo, acredito que isso mostrará a eles quem é o chefe ...
Usar
_top
como parâmetro de destino parawindow.open()
iniciará na mesma janela.fonte
fonte
Vou ser corajoso e jogar meu chapéu no anel neste (antigo como é), ver quantos votos negativos posso coletar.
Aqui está minha tentativa, que parece funcionar em todos os lugares em que a testei (Chrome20, IE8 e FF14):
Coloquei esse código no
<head>
e o chamei no final do<body>
para garantir que minha página seja renderizada antes de começar a discutir com o código malicioso, não sei se essa é a melhor abordagem, YMMV.Como funciona?
... eu ouço você perguntar - bem, a resposta honesta é: eu não realmente sei. Demorou muito tempo para fazê-lo funcionar em todos os lugares que eu estava testando, e o efeito exato que isso varia um pouco, dependendo de onde você o executa.
Aqui está o pensamento por trás disso:
Para o meu
http://mysite.tld/page-that-takes-a-while-to-load
(o destino do XHR), usei um script PHP parecido com este:O que acontece?
Você não pode evitar o tempo de espera no Chrome e Firefox?
Aparentemente não. No começo, apontei o XHR para uma URL que retornaria um 404 - isso não funcionou no Firefox. Depois, tentei a
sleep(5);
abordagem que acabei encontrando para obter essa resposta e comecei a brincar com a duração do sono de várias maneiras. Não consegui encontrar um padrão real para o comportamento, mas descobri que, se for muito curto, especificamente o Firefox não jogará bola (o Chrome e o IE parecem ser bastante bem-comportados). Não sei qual é a definição de "muito curto" em termos reais, mas cinco segundos parecem funcionar sempre.Se algum ninjas Javascript de passagem quiser explicar um pouco melhor o que está acontecendo, por que isso é (provavelmente) errado, não confiável, o pior código que eles já viram etc.
fonte
A partir de 2015, você deve usar a
frame-ancestors
diretiva do CSP2 para isso. Isso é implementado através de um cabeçalho de resposta HTTP.por exemplo
Obviamente, muitos navegadores não oferecem suporte ao CSP2, portanto, é aconselhável incluir o
X-Frame-Options
cabeçalho antigo :Eu recomendaria incluir os dois de qualquer maneira, caso contrário, seu site continuaria vulnerável a ataques de Clickjacking em navegadores antigos e, é claro, você obteria um enquadramento indesejável, mesmo sem intenção maliciosa. A maioria dos navegadores é atualizada automaticamente atualmente, no entanto, você ainda tende a impedir que os usuários corporativos fiquem presos nas versões antigas do Internet Explorer por motivos de compatibilidade de aplicativos herdados.
fonte
Ok, então sabemos que estavam em um quadro. Então localizamos.href para outra página especial com o caminho como uma variável GET. Agora, explicamos ao usuário o que está acontecendo e fornecemos um link com a opção target = "_ TOP". É simples e provavelmente funcionaria (ainda não foi testado), mas requer alguma interação do usuário. Talvez você possa apontar o site ofensivo para o usuário e fazer uma espécie de vergonha de clickers para o seu site em algum lugar .. Apenas uma idéia, mas funciona de noite ..
fonte
Todas as soluções propostas forçam diretamente uma alteração na localização da janela superior. E se um usuário quiser que o quadro esteja lá? Por exemplo, o quadro superior nos resultados da imagem dos mecanismos de pesquisa.
Escrevi um protótipo em que, por padrão, todas as entradas (links, formulários e elementos de entrada) estão desativadas e / ou não fazem nada quando ativadas.
Se um quadro contendo for detectado, as entradas serão desativadas e uma mensagem de aviso será exibida na parte superior da página. A mensagem de aviso contém um link que abrirá uma versão segura da página em uma nova janela. Isso impede que a página seja usada para o clickjacking, enquanto ainda permite que o usuário visualize o conteúdo em outras situações.
Se nenhum quadro contendo for detectado, as entradas serão ativadas.
Aqui está o código. Você precisa definir os atributos HTML padrão para valores seguros e adicionar atributos adicionais que contenham os valores reais. Provavelmente está incompleto e, para total segurança, atributos adicionais (penso nos manipuladores de eventos) provavelmente terão que ser tratados da mesma maneira:
fonte
Bem, você pode modificar o valor do contador, mas essa é obviamente uma solução quebradiça. Você pode carregar seu conteúdo via AJAX depois de determinar que o site não está dentro de um quadro - também não é uma ótima solução, mas espero evitar o acionamento do evento on beforeunload (suponho).
Edit: Outra idéia. Se você detectar que está em um quadro, peça ao usuário para desativar o javascript, antes de clicar em um link que o leve ao URL desejado (passar uma string de consulta que informe à sua página para informar ao usuário que ele pode reativar o javascript quando existem).
Editar 2: Seja nuclear - se você detectar que está em um quadro, basta excluir o conteúdo do corpo do documento e imprimir alguma mensagem desagradável.
Edit 3: Você pode enumerar o documento principal e definir todas as funções como nulas (mesmo as anônimas)?
fonte
<body>
interior de uma<plaintext>
marca definidadisplay: none
. É bastante eficaz.Se você adicionar um alerta logo após o código do buster, o alerta interromperá o encadeamento javascript e deixará a página carregar. É isso que o StackOverflow faz, e ele sai dos meus iframes, mesmo quando eu uso o buster de frame-busting. Também funcionou com minha página de teste simples. Isso foi testado apenas no Firefox 3.5 e IE7 no Windows.
Código:
fonte
Eu acho que você estava quase lá. Você tentou:
ou alternativamente:
Nota: Na verdade, eu não testei isso.
fonte
Que tal chamar o imbecil repetidamente também? Isso criará uma condição de corrida, mas pode-se esperar que o imbecil saia por cima:
fonte
Se você observar os valores retornados por
setInterval()
eles, geralmente têm um dígito, então você pode desativar todas essas interrupções com uma única linha de código:fonte
Eu só poderia ter conseguido uma maneira de quebrar o javascript do frame buster buster. Usando o getElementsByName na minha função javascript, defini um loop entre o frame buster e o script do frame buster buster. confira este post. http://www.phcityonweb.com/frame-buster-buster-buster-2426
fonte
setInterval e setTimeout criam um intervalo de incremento automático. Cada vez que setTimeout ou setInterval é chamado, esse número aumenta em um, de modo que, se você chamar setTimeout, obterá o valor mais alto atual.
Como é quase inédito que haja 10000 setIntervals e setTimeouts simultâneos funcionando, e como setTimeout retorna "último intervalo ou tempo limite criado + 1", e como top.clearInterval ainda está acessível, isso derrotará os ataques de chapéu preto no quadro sites descritos acima.
fonte
Use o htaccess para evitar o conjunto de quadros de alto desempenho, iframe e qualquer conteúdo como imagens.
Isso mostrará uma página de direitos autorais em vez da esperada.
fonte
<meta name="referrer" …/>
eb) também definido ao clicar em links, para que você também não permita links para sua página e quebre a teia.