Glossário

O que é clickjacking? Um ataque que faz você clicar em botões de uma página transparente sobreposta a outra

O clickjacking sobrepõe uma página real invisível para induzir cliques ocultos. Como funciona e a defesa: CSP frame-ancestors e X-Frame-Options.

Publicado 2026-06-10 Atualizado 2026-10-06 8 min de leitura
Nesta página

O clickjacking engana você para clicar num botão de uma página oculta por baixo da que você vê. Veja como ele funciona e como preveni-lo de forma confiável (sem passos de ataque).

O que é alvo

Tudo que seja "um clique, feito, e valioso".

Alvo provávelPor quê
Confirmar uma transferência/compraUm clique move dinheiro
Mudança de configuração (visibilidade, apps conectados)Prepara um sequestro de conta ou acesso a dados mais tarde
OAuth / "Permitir" permissãoAprova silenciosamente uma vinculação de conta
Seguir / curtir / postar em redes sociaisAbusado para disseminação e fazenda de curtidas

Por que funciona

Os navegadores podem carregar outro site num iframe e empilhá-lo por cima. O atacante torna esse iframe transparente (opacity 0), de modo que o usuário só vê a interface-isca colocada por baixo. Quando o usuário clica no "botão falso", o botão real posicionado logo acima recebe o clique.

Página do atacante: "Você ganhou um prêmio — clique abaixo!"
= um iframe transparente da página real do banco/configurações por cima
↓ o usuário clica no botão-isca visível
o botão real "Confirmar" logo acima é o que de fato é clicado
↓ sob o próprio login do usuário
transferência / mudança de configuração / consentimento se conclui como "a ação do usuário"
O atacante empilha o site real de forma invisível; só a interface-isca fica visível. O clique vai para a página real transparente.

Parece-se com o CSRF, mas o CSRF envia uma requisição nos bastidores, enquanto o clickjacking faz o usuário operar a tela real — então tokens CSRF sozinhos não o impedem.

Caso real: a caixa de permissões de um plugin de navegador (2008)

Em outubro de 2008, a Adobe publicou um aviso de segurança (APSA08-08) sobre um problema de clickjacking que afetava vários navegadores. Segundo a imprensa, ao sobrepor de forma invisível a caixa de configurações do Flash Player, um site podia fazer o usuário conceder acesso à câmera e ao microfone sem perceber. A Adobe lançou versões corrigidas do Flash Player e, como solução provisória, orientou os usuários a escolher "sempre negar" no "Settings Manager" (o gerenciador de configurações do Flash Player).

A lição: botões de transferência não são o único alvo. Qualquer tela em que um único clique entrega uma permissão ("Permitir", "Concordo", "Conectar") entra no escopo. A MITRE classifica essa fraqueza como CWE-1021 (Improper Restriction of Rendered UI Layers or Frames).

Defesa: não deixe outros sites embutirem o seu

1

Defina CSP frame-ancestors (o mais importante)

Adicione Content-Security-Policy: frame-ancestors 'self' (apenas sua própria origem pode colocá-lo em frame). Se ninguém precisa embutir você, 'none' é o mais seguro. Liste domínios apenas para os parceiros que você permite explicitamente.

2

Adicione X-Frame-Options também (compatível com versões antigas)

Para clientes mais antigos, envie também X-Frame-Options: DENY (ou SAMEORIGIN). Isso cobre tanto navegadores antigos quanto novos.

3

Adicione uma etapa de confirmação para ações críticas

Proteja transferências e concessões de permissão atrás de reautenticação, de uma caixa de confirmação ou de uma verificação de intenção — mais difícil de conduzir por uma sobreposição silenciosa.

4

Torne os cookies de sessão SameSite

SameSite=Lax/Strict contém o envio automático entre sites. Não é uma correção completa de clickjacking por si só, mas enfraquece a classe mais ampla de "ação iniciada a partir de outro site".

X-Frame-Options vs CSP frame-ancestors

Os dois cabeçalhos impedem que outros sites embutam o seu, mas diferem nos detalhes.

X-Frame-OptionsCSP frame-ancestors
ValoresDENY (bloqueia tudo) / SAMEORIGIN (só a mesma origem)'none' / 'self' / uma lista de domínios permitidos
Vários sites autorizados a embutirNão é possível (ALLOW-FROM não funciona nos navegadores modernos)Possível
Configurar via meta tagSem efeitoSem efeito
Quando os dois estão presentesIgnorado pelos navegadores compatíveisTem prioridade
PapelReserva para navegadores antigosA defesa principal hoje

Ao enviar os dois, mantenha o mesmo significado: combine frame-ancestors 'none' com DENY, e frame-ancestors 'self' com SAMEORIGIN.

Erros comuns de configuração

  • Supor que o default-src do CSP cobre isso. O frame-ancestors não herda do default-src. Mesmo com default-src 'none', a incorporação continua permitida se você não escrever frame-ancestors
  • Colocar numa meta tag: o <meta http-equiv> não tem efeito aqui, então envie como cabeçalho de resposta
  • Deixar como Content-Security-Policy-Report-Only: isso só relata violações e não bloqueia a incorporação. Passe para o cabeçalho que aplica a regra depois de confirmar que funciona
  • Configurar só em algumas páginas: as pessoas verificam a página inicial e esquecem a página de login, as de configurações ou as de erro. Confirme também que uma CDN ou um proxy não está removendo o cabeçalho

Como verificar seu próprio site

1

Verifique com uma ferramenta de cabeçalhos

Informe a URL do seu site no verificador de cabeçalhos de segurança e veja se X-Frame-Options e o frame-ancestors do CSP são retornados. Verifique não só a página inicial, mas também as páginas de configurações com login e as páginas de transferência ou de concessão de permissões.

2

Verifique nas ferramentas de desenvolvedor do navegador

Recarregue a página com a aba Network (Rede) aberta e veja os cabeçalhos da resposta HTML. Confira também se o cabeçalho não é enviado duas vezes ou com valores conflitantes.

3

Configure em um só lugar

Adicioná-lo a todas as respostas em um só lugar (o servidor web, como nginx ou Caddy, o proxy reverso ou o framework) evita tanto lacunas quanto duplicações. Se você vai escrever um CSP novo, o gerador de CSP monta um que inclui o frame-ancestors.

A visão deste site: uma linha de cabeçalho é a correção mais eficaz, então verifique seu próprio site primeiro

A defesa contra clickjacking não é código complexo; são uma ou duas linhas de cabeçalho de resposta que bloqueiam a incorporação. Aplique-as em todo o site no framework ou no proxy reverso (Caddy/nginx) para que nada escape. A falha mais comum é um cabeçalho que você achou que tinha configurado, mas que na verdade está ausente, então, depois de configurar, confirme com os passos acima que ele está de fato sendo retornado.

Fontes (primárias)

  • OWASP, "Clickjacking Defense Cheat Sheet" — cheatsheetseries.owasp.org (frame-ancestors, X-Frame-Options, SameSite; ALLOW-FROM não funciona mais; meta tags não têm efeito; limites do frame busting)
  • MDN, "CSP: frame-ancestors" — developer.mozilla.org (valores permitidos, sem herança do default-src, sem suporte em meta)
  • RFC 7034, "HTTP Header Field X-Frame-Options" — rfc-editor.org
  • IPA, "How to Secure Your Web Site, 1.9 Clickjacking" (em japonês) — ipa.go.jp
  • Adobe, "Security Advisory for Flash Player (APSA08-08)" (7 de outubro de 2008) — adobe.com
  • Computerworld, "Clickjackers could hijack webcams, microphones, Adobe warns" (outubro de 2008) — computerworld.com (o alvo era a caixa de permissão da câmera e do microfone)
  • MITRE, "CWE-1021: Improper Restriction of Rendered UI Layers or Frames" — cwe.mitre.org

Leia a seguir

Classificação

O CWE classifica os tipos de fraqueza por trás das vulnerabilidades; o MITRE ATT&CK classifica as técnicas dos atacantes. Ambos são mantidos pela MITRE e amplamente usados para rotular vulnerabilidades e regras de detecção.

CWE™: Copyright © 2006–2026, The MITRE Corporation. CWE is a trademark of The MITRE Corporation. The MITRE Corporation hereby grants you a non-exclusive, royalty-free license to use CWE for research, development, and commercial purposes. Any copy you make for such purposes is authorized on the condition that you reproduce MITRE’s copyright designation and this license in any such copy. CWE Terms of Use

FAQ

QO que o clickjacking pode fazer?
A

Um clique que o usuário faz 'de propósito' cai no botão de uma página real posicionada por baixo. Ações críticas de um clique são abusadas: transferências de dinheiro, mudanças de configuração, concessão de permissões, seguir/curtir em redes sociais, botões de consentimento. Ele não rouba uma senha — faz o usuário já logado executar a ação.

QQual é a principal defesa?
A

Recusar ser embutido no frame de outro site. Defina a diretiva CSP frame-ancestors como 'self' (ou apenas domínios permitidos) nos cabeçalhos de resposta e adicione X-Frame-Options: DENY para compatibilidade retroativa. Isso remove a superfície de que uma sobreposição precisa.

QO frame-busting via JavaScript é suficiente?
A

Não. Scripts antigos de 'sair se eu estiver num iframe' têm muitas formas de contorno e não ajudam quando o JS está desativado. A defesa confiável são cabeçalhos no servidor (frame-ancestors / X-Frame-Options) que dizem ao navegador para recusar o embed.

QX-Frame-Options ou CSP frame-ancestors: qual devo usar?
A

Envie os dois com o mesmo significado; essa é a prática padrão. O frame-ancestors aceita vários sites autorizados a embutir, e quando os dois estão presentes, os navegadores que o suportam aplicam o frame-ancestors. O X-Frame-Options é um recurso de reserva para navegadores antigos. Combine 'none' com DENY e 'self' com SAMEORIGIN.

QPosso configurá-lo com uma meta tag HTML?
A

Não. O frame-ancestors não tem efeito num elemento meta, e o X-Frame-Options num elemento meta também é ignorado. Os dois precisam ser enviados como cabeçalhos de resposta HTTP, configurados no seu servidor web, proxy reverso ou framework.

QE se eu precisar permitir que meus outros sites ou um parceiro embutam páginas?
A

Liste as partes autorizadas no frame-ancestors (por exemplo, frame-ancestors 'self' https://partner.example). O ALLOW-FROM do X-Frame-Options não funciona nos navegadores modernos, então não dependa dele para uma lista de permissões. Limite a permissão às páginas e domínios que realmente precisam ser embutidos.