Glossário
O que é clickjacking — armadilhas invisíveis que fazem você clicar em botões ocultos
O clickjacking sobrepõe uma página real de forma invisível sobre o site do atacante, fazendo um usuário logado clicar em botões 'ocultos'. Como funciona e a defesa de verdade (CSP frame-ancestors e X-Frame-Options para que seu site não possa ser colocado em frame) — explicado de forma defensiva, sem passos de ataque.
"O botão em que você clicou de propósito era, na verdade, um botão de uma página oculta por baixo" — isso é clickjacking. 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ável | Por quê |
|---|---|
| Confirmar uma transferência/compra | Um clique move dinheiro |
| Mudança de configuração (visibilidade, apps conectados) | Prepara um domínio futuro ou acesso a dados |
| OAuth / "Permitir" permissão | Aprova silenciosamente uma vinculação de conta |
| Seguir / curtir / postar em redes sociais | Abusado 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.
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.
Defesa: a correção de verdade é "não poder ser colocado em frame"
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.
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). Reforço duplo entre navegadores antigos e novos.
Exija um segundo passo 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.
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".
A visão deste site: uma linha de cabeçalho faz o máximo — meça seu próprio site primeiro
A defesa contra clickjacking não é código sofisticado; são uma ou duas linhas de cabeçalho de resposta que removem a base de que uma sobreposição precisa. Aplique-as em todo o site no framework ou no proxy reverso (Caddy/nginx) para que nada escape. Você pode verificar se frame-ancestors está de fato ativo com o verificador de cabeçalhos de segurança nas ferramentas deste site. "Achei que tinha configurado" — o cabeçalho ausente — é a falha mais comum.
Leia a seguir
- Glossário: O que é CSRF · O que é XSS
- Verifique: Ferramentas de segurança gratuitas (verificador de cabeçalhos de segurança)
FAQ
QO que o clickjacking pode fazer?
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?
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?
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 correção de verdade são cabeçalhos no servidor (frame-ancestors / X-Frame-Options) que dizem ao navegador para recusar o embed.