Nota dos cabeçalhos de segurança
Seis linhas curtas na resposta de um servidor dizem ao navegador quanto cuidado ter com a sua página. Esta verificação as lê, dá uma nota de 0 a 100 e escreve as que faltam para você.
Cabeçalhos são instruções, não conteúdo
Toda vez que um navegador pede uma página, o servidor responde em duas partes. A segunda é a própria página. A primeira é uma lista de cabeçalhos, linhas curtas de nome e valor que o visitante nunca vê, como o tipo do arquivo, por quanto tempo guardá-lo em cache e quais cookies manter.
Algumas dessas linhas são instruções de segurança. Elas não tornam o seu servidor mais difícil de invadir. Elas ativam proteções que todo navegador moderno já traz embutidas, e que ficam desligadas até que um site as peça. Um site que não envia nenhuma delas continua funcionando bem. Ele só está deixando uma armadura grátis dentro da caixa.
Os seis cabeçalhos que esta verificação pontua
| Cabeçalho | Pontos | O que ele evita |
|---|---|---|
Strict-Transport-Security | 25 | Um visitante rebaixado discretamente para http:// sem criptografia num Wi-Fi hostil. Depois da primeira visita, o navegador recusa HTTP simples para o seu domínio pelo tempo indicado em max-age. |
Content-Security-Policy | 25 | Scripts injetados. Você publica a lista de lugares de onde o código pode ser carregado, e todo o resto é bloqueado, mesmo que um atacante consiga enfiar uma tag <script> num comentário ou num campo de formulário. |
X-Frame-Options | 15 | Clickjacking, quando outro site carrega o seu num quadro invisível e engana as pessoas para que cliquem nos seus botões. O equivalente moderno é frame-ancestors dentro da CSP, que esta verificação também aceita. |
X-Content-Type-Options | 15 | Adivinhação de tipo. Com nosniff, um arquivo enviado como imagem não pode ser executado como script porque o navegador “achou que parecia um”. |
Referrer-Policy | 10 | O vazamento dos endereços completos das páginas, incluindo qualquer coisa privada na URL, para todos os sites para os quais você aponta links. |
Permissions-Policy | 10 | Conteúdo de terceiros incorporado pedindo a câmera, o microfone ou a localização em seu nome. |
Os pesos seguem o tamanho do estrago que cada um evita. Os dois cabeçalhos de 25 pontos barram os ataques que realmente esvaziam contas. Os de 10 pontos tratam de privacidade e boas maneiras.
Como ler a nota
Um cabeçalho só conta por inteiro quando o seu valor cumpre o papel. Três situações valem pontuação parcial:
- HSTS com menos de seis meses. Um
max-agede um dia serve enquanto você testa, mas protege os visitantes que voltam por um dia só. - Uma CSP que permite
'unsafe-inline'ou'unsafe-eval'sem nonces nem hashes. É justamente a porta que a política deveria fechar. - Uma CSP em modo
Report-Only. Ela observa e relata, mas ainda não bloqueia nada. É o primeiro passo certo, desde que você não pare aí.
A verificação também lista cada cookie que a página define e se ele traz Secure, HttpOnly e SameSite. Essas marcações não entram na nota, mas um cookie de sessão sem elas desfaz boa parte do que os cabeçalhos conseguem.
Um A aqui significa que as proteções do lado do navegador estão ativadas para esta resposta específica. Isso não diz nada sobre senhas, plugins ou atualizações do servidor. Páginas diferentes do mesmo site também podem enviar cabeçalhos diferentes, então teste as páginas que importam: login, finalização de compra, conta.
Onde adicioná-los
Os cabeçalhos são definidos onde quer que as respostas sejam produzidas, e a camada mais próxima do visitante vence:
- Uma CDN ou proxy (Cloudflare, Fastly, a borda de uma hospedagem)
- Normalmente uma regra de “cabeçalho de resposta” ou de “transformação” no painel. Uma regra cobre o site inteiro, inclusive as páginas em cache.
- Apache
- No
.htaccessou no virtual host:Header always set X-Content-Type-Options "nosniff". A palavraalwaysfaz a regra valer também nas páginas de erro. - nginx
add_header X-Content-Type-Options "nosniff" always;no blocoserver. Atenção a um detalhe: umadd_headerdentro de um blocolocationsubstitui os de cima, em vez de se somar a eles.- A aplicação
- Frameworks e plugins de CMS podem enviar cabeçalhos, mas só nas páginas que eles geram. Os arquivos estáticos servidos diretamente pelo servidor web vão ficar sem eles.
Comece pelos quatro que não podem quebrar nada: nosniff, X-Frame-Options: SAMEORIGIN, uma Referrer-Policy e uma Permissions-Policy. Adicione o HSTS quando todos os subdomínios funcionarem em HTTPS. Deixe a Content-Security-Policy por último e implante-a primeiro em modo report-only, porque uma CSP errada vai bloquear os seus próprios scripts.
Perguntas frequentes
Adicionar cabeçalhos de segurança pode quebrar o meu site?
Quatro dos seis podem ser adicionados sem receio. Os dois que exigem cuidado são o HSTS e a Content-Security-Policy. O HSTS prende os visitantes ao HTTPS pelo tempo que você definir, então todos os subdomínios já precisam ter um certificado válido se você usar includeSubDomains. Uma CSP bloqueia tudo o que não está na sua lista. Teste-a com Content-Security-Policy-Report-Only por uma ou duas semanas antes de aplicá-la.
Cabeçalhos de segurança ajudam no SEO?
Não diretamente. Os mecanismos de busca não classificam páginas pelos cabeçalhos. O HTTPS é um sinal leve de classificação, e o HSTS faz o HTTPS se manter. O que você ganha de verdade são menos páginas invadidas, e um site invadido perde posições rapidamente.
Por que o X-XSS-Protection não está na lista?
Os navegadores removeram o filtro que ele controlava. O Chrome o abandonou em 2019 e o Firefox nunca o teve. A recomendação atual é deixá-lo de fora ou defini-lo como 0, e contar com uma Content-Security-Policy.
Que max-age o HSTS deve usar?
Um ano (max-age=31536000) é o objetivo habitual e o mínimo para as listas de preload dos navegadores. Comece com alguns minutos, confira que nada quebra e depois aumente aos poucos. Esta verificação dá a pontuação máxima a partir de seis meses.
O meu site está atrás da Cloudflare. De quem são estes cabeçalhos?
São os que o visitante recebe, e são esses que importam. Se o seu servidor de origem define um cabeçalho e a CDN o remove ou o substitui, a nota reflete a versão da CDN.