Defaults.Exposed

Defaults.ExposedCorreções › Proteção contra clickjacking (X-Frame-Options)

Como corrigir Proteção contra clickjacking (X-Frame-Options)

Uma instrução de uma linha que diz aos navegadores para não deixarem outros sites carregarem o seu site, em segredo, dentro deles próprios. Sem ela, um burlão pode esconder as suas páginas reais, com o cliente já autenticado, por trás de uma página falsa e levar os seus clientes a clicar em coisas que nunca pretenderam — aprovar um pagamento, alterar uma palavra-passe, conceder acessos.

O essencial para o seu negócio: Um fraudador pode envolver de forma invisível o seu site real dentro de um site falso e roubar dinheiro ou acessos às contas dos seus clientes autenticados — e, para o cliente, parece que foi o seu site que o fez. A correção é gratuita e ocupa um programador cerca de 15 minutos; deixá-la de fora é uma falha conhecida que tanto criminosos como compradores cautelosos detetam em segundos.

Quanto isto lhe pode custar

Por que importa. Esta é uma definição gratuita, de uma única linha, que demora minutos a adicionar e fecha toda uma categoria de truques dirigidos aos seus clientes autenticados. Na nossa pontuação é uma verificação de segurança web que vale pontos a sério, classificada como de severidade elevada, porque um cabeçalho em falta deixa um buraco conhecido e fácil de detetar que os criminosos automatizam e os compradores procuram.

O que é isto, em palavras simples

Quando alguém visita o seu site, o navegador pode também ser instruído a carregar o seu site dentro de outro site — como uma pequena janela incorporada numa página maior. Isso parece inofensivo, e às vezes é. Mas é o mecanismo por trás de um ataque chamado clickjacking.

Eis o truque. Um burlão constrói a sua própria página e carrega discretamente o seu site real dentro dela — de forma invisível, tornando-o totalmente transparente. Depois sobrepõe o seu próprio conteúdo: um botão chamativo, um «Reproduzir vídeo», um «Receba o seu prémio». O seu cliente vê a página do atacante e clica no que parece ser um botão inofensivo. Mas, como o seu site real está, invisível, por baixo do cursor, o clique acaba na sua página — a confirmar um pagamento, a alterar uma palavra-passe, a aprovar um acesso, a aceitar uma permissão. O cliente julga ter clicado numa coisa; clicou noutra, num site em que confia.

A proteção contra clickjacking é uma instrução curta e invisível que o seu site envia ao navegador de cada visitante, dizendo, na prática:

«Não deixes outros sites carregarem-me dentro deles. Se alguém tentar, recusa.»

Os navegadores modernos obedecem automaticamente. Com ela ativada, o truque simplesmente não funciona — a cópia incorporada do seu site recusa-se a carregar. Sem ela, o seu site é alvo livre para ser usado como a camada escondida de uma fraude, e o cliente apanhado vai associar tudo isto à sua marca, não à do atacante.

O que isto lhe pode custar

São cenários realistas, do dia a dia. Nunca nomeamos uma empresa real; estas são ilustrações de como a falha é explorada.

  1. O «confirmar» invisível. Um cliente está autenticado no portal da sua conta num separador. Cai numa página (de um anúncio, de um e-mail, de um resultado de pesquisa) que promete algo apelativo e mostra um grande botão «Continuar». Escondido por baixo desse botão está o seu controlo real «Confirmar transferência» ou «Alterar e-mail», carregado a partir da sessão autenticada do próprio cliente. Ele clica em «Continuar» — e autoriza, sem o saber, uma alteração na conta real que tem consigo. Para ele, e para a sua equipa de apoio, parece que foi ele que o fez no seu site.

  2. O sequestro de definições. Um atacante incorpora a sua página de definições da conta e sobrepõe-lhe um jogo ou inquérito inocente. Alguns cliques nos sítios certos alteram silenciosamente uma definição — adicionar o e-mail do atacante como endereço de recuperação, conceder uma permissão a uma aplicação ou desativar um alerta de segurança. A conta fica discretamente comprometida, e nada parecia errado na altura.

  3. O negócio que trava. Um cliente maior envia o seu questionário de segurança habitual antes de assinar. Uma linha pergunta se o seu site define proteção contra incorporação (X-Frame-Options / CSP frame-ancestors). O seu contacto de TI tem de responder «não», e o departamento de compras faz uma pausa enquanto corre a corrigir uma definição gratuita de 15 minutos que agora parece uma bandeira vermelha perante um comprador.

  4. A campanha que usa a marca como isco. Como as suas páginas reais e de confiança podem ser incorporadas, um atacante usa o seu início de sessão ou checkout como a camada convincente de uma campanha de phishing mais ampla. Os clientes apanhados não culpam o atacante na sombra — recordam-no como a vez em que «o seu site» os deixou ser burlados.

  5. A nota da auditoria. A análise de uma seguradora, ou um auditor a rever a sua postura de segurança, lista a ausência de proteção contra clickjacking entre as conclusões. É um item de manual, de higiene básica; tê-lo assinalado sinaliza que as proteções fáceis e gratuitas não estavam ativas — o que tinge a forma como o resto da sua segurança é avaliada.

O fio condutor: o dano cai sobre um cliente real, autenticado, a fazer algo que não pretendia — e leva o seu nome, não o do atacante.

O que isto é, na realidade

Quando um navegador pede uma página ao seu site, o servidor devolve a página mais alguns «cabeçalhos» invisíveis — instruções extra que o navegador lê mas que o visitante nunca vê. A proteção contra clickjacking é entregue através destes cabeçalhos. Há dois, e a nossa verificação é aprovada se qualquer um estiver presente:

1. O cabeçalho mais antigo — X-Frame-Options:

X-Frame-Options: SAMEORIGIN

Este é o controlo de longa data e amplamente suportado. Aceita um de dois valores práticos:

2. O cabeçalho moderno — Content-Security-Policy frame-ancestors:

Content-Security-Policy: frame-ancestors 'self';

Este é o controlo mais recente e flexível, e aquele para que apontam as normas atuais. Faz o mesmo trabalho mas permite-lhe ser preciso sobre quem o pode incorporar:

O que é «bom»

A configuração mais forte usa ambos: frame-ancestors para navegadores modernos (e pela precisão de nomear quem pode incorporar) e X-Frame-Options: SAMEORIGIN como recurso para clientes mais antigos. A nossa verificação é satisfeita por qualquer um deles isoladamente — mas, como ambos são gratuitos e levam os mesmos poucos minutos, não há razão para não definir os dois.

Um pormenor importante que o seu programador deve saber: um cabeçalho Content-Security-Policy-Report-Only não impõe nada — apenas reporta. Se quiser que a proteção contra clickjacking surta efeito, ela tem de vir de um cabeçalho que imponha (uma Content-Security-Policy normal com frame-ancestors, ou o X-Frame-Options), não de um apenas-de-relatório.

Como corrigir (gratuito, ~15 minutos)

Entregue esta secção a quem gere o seu site — o seu responsável de TI, programador web ou apoio de alojamento. A correção é gratuita. São um ou dois cabeçalhos de resposta, ou uma regra na sua CDN. Não há nada a comprar.

A verificação é aprovada quando ou um cabeçalho X-Frame-Options (definido como DENY ou SAMEORIGIN) ou uma diretiva CSP frame-ancestors estiver presente. A configuração recomendada, à prova de bala, adiciona ambos.

Passo 1 — Decidir quão restritivo ser

Passo 2 — Adicionar os cabeçalhos (escolha a sua plataforma)

Nginx — dentro do seu bloco server:

add_header X-Frame-Options "SAMEORIGIN" always;
add_header Content-Security-Policy "frame-ancestors 'self';" always;

Apache — garanta que o mod_headers está ativado, depois no seu virtual host:

Header always set X-Frame-Options "SAMEORIGIN"
Header always set Content-Security-Policy "frame-ancestors 'self';"

Microsoft IIS — no web.config, dentro de <customHeaders>:

<add name="X-Frame-Options" value="SAMEORIGIN" />
<add name="Content-Security-Policy" value="frame-ancestors 'self';" />

Cloudflare (ou uma CDN semelhante): vá a Rules → Transform Rules → Modify Response Header e adicione duas regras que definam X-Frame-Options como SAMEORIGIN e Content-Security-Policy como frame-ancestors 'self'; em todas as respostas. Este é o caminho mais fácil se não tiver acesso direto ao servidor.

Já envia uma Content-Security-Policy por outros motivos? Não crie um segundo cabeçalho CSP — adicione frame-ancestors à sua política existente. Dois cabeçalhos CSP podem entrar em conflito.

Construtores de sites (Squarespace, Wix, Shopify e semelhantes): estas plataformas definem muitas vezes a proteção contra incorporação por si, por isso pode já passar sem ter nada a fazer. Se a nossa verificação a assinalar, o controlo costuma estar nas definições de segurança da plataforma, ou adiciona-o na CDN à frente do site. (Nota: o Google Workspace e o Microsoft 365 alimentam o seu e-mail, não o seu site — este cabeçalho define-se onde o seu site público realmente vive, não na administração do Workspace/365.)

Passo 3 — Recarregar e verificar

Recarregue o servidor web ou implemente a regra da CDN, depois abra o seu site real e verifique os cabeçalhos de resposta — ferramentas de programador do navegador → separador Network → clicar no pedido da página → Response Headers, ou qualquer ferramenta gratuita de verificação de cabeçalhos. Confirme que o(s) cabeçalho(s) aparece(m) nas respostas de páginas reais, não só na página inicial. Depois volte a correr a verificação.

Erros comuns

Perguntas frequentes

Não percebo de tecnologia — posso tratar disto sozinho?

Não precisa de fazer a parte técnica. É uma única definição acrescentada ao servidor do seu site ou à sua CDN, e qualquer programador web ou prestador de TI a adiciona em poucos minutos. Entregue-lhe a secção «Como corrigir» mais abaixo — diz-lhe exatamente o que acrescentar. A correção é gratuita; só cobramos se quiser que continuemos a monitorizar que ela se mantém ativa.

Isto vai impedir o meu próprio site, ou parceiros legítimos, de mostrar as minhas páginas?

Só se a configurar de forma demasiado restritiva. A definição comum («SAMEORIGIN», ou «frame-ancestors self») continua a deixar o seu próprio site incorporar as suas páginas normalmente — só bloqueia sites externos. Se um parceiro genuíno precisar de incorporar uma página específica sua, o seu programador pode autorizar essa única origem e continuar a bloquear todos os outros.

Somos uma pequena empresa — alguém se daria ao trabalho de nos atacar?

Estes ataques são executados em massa por ferramentas automáticas, não escolhidos a dedo. Os sites mais pequenos são muitas vezes atingidos precisamente por serem os que não têm proteções básicas como esta. O atacante não precisa de saber quem é — só precisa que o seu site seja incorporável. Fechar a falha não lhe custa nada.

O que é, na prática, «bom»?

Ou um cabeçalho X-Frame-Options definido como SAMEORIGIN (ou DENY), ou uma Content-Security-Policy com a diretiva frame-ancestors — idealmente ambos. A nossa verificação é aprovada se qualquer um deles estiver presente. O controlo moderno e mais flexível é o frame-ancestors; o X-Frame-Options é o cabeçalho mais antigo que ainda cobre alguns navegadores legados, por isso a configuração à prova de bala usa os dois.

Isto não é o mesmo que o cadeado SSL ou o HTTPS?

Não — protegem contra coisas completamente diferentes. O HTTPS cifra a ligação para que ninguém a possa ler em trânsito. A proteção contra clickjacking impede que as suas páginas sejam, de todo, carregadas dentro do site de outra pessoa. Pode ter um cadeado perfeito e estar totalmente exposto ao clickjacking. São verificações separadas e quer as duas.

Se não corrigirmos, a nossa nota baixa?

Sim. Esta é uma verificação de segurança web pontuada, não meramente informativa — um cabeçalho em falta custa pontos e é classificado como severidade elevada, porque expõe diretamente os seus clientes autenticados à fraude. É também um dos pontos mais baratos de recuperar: um único cabeçalho gratuito, cerca de 15 minutos de um programador.