pressione ⌘K para trocar de ferramenta
SECURITY

Verificador de Cabeçalhos de Segurança HTTP

Dê nota aos cabeçalhos de segurança HTTP de um site e veja o que cada ausência expõe.

server
security-headers

🌐 sitekits fetches the URL server-side (private/internal addresses are blocked). Only response headers are read — the body is never retrieved.

§01 SOBRE ESTA FERRAMENTA

Visão geral

Os cabeçalhos de segurança são a parte da defesa de um site que vive inteiramente na resposta, o que os torna fáceis de verificar e fáceis de errar de forma subtil. Um cabeçalho pode estar presente e não fazer nada: max-age=0 desliga o HSTS, uma CSP que contém 'unsafe-inline' executa igualmente um <script> injetado, e X-Frame-Options: ALLOW-FROM é ignorado por todos os navegadores distribuídos hoje.

Este verificador recupera o URL do lado do servidor, lê apenas os cabeçalhos da resposta e classifica sete pontos numa escala ponderada de 100. Os pesos refletem o que cada um evita realmente, e cada nota vem acompanhada de uma observação que nomeia a exposição concreta em vez de um genérico «cabeçalho ausente».

Como usar

  1. Cole um URL. O esquema pode ser omitido; assume-se https.
  2. Leia a classificação e as notas por ponto.
  3. Percorra as observações. Cada uma descreve o que fica exposto, não apenas o que falta.

O que significam os pesos

Contar cabeçalhos trata cada falta como equivalente. Não é: um X-Frame-Options ausente pode ser coberto por frame-ancestors na CSP, enquanto uma CSP ausente não tem substituto algum.

PontoPesoMotivo
Content-Security-Policy25O único cabeçalho que impede um script injetado de executar e exfiltrar
Strict-Transport-Security20Evita que o primeiro pedido seja rebaixado para HTTP
Proteção contra enquadramento15Clickjacking; satisfeita por CSP frame-ancestors ou X-Frame-Options
X-Content-Type-Options10Um content-type errado reinterpretado como script
Referrer-Policy10Quanto dos seus URL escapa para outras origens
Permissions-Policy10Câmara, microfone e geolocalização deixados implicitamente abertos
Divulgação de versão10Uma dedução, não uma proteção — ver abaixo

Como os valores são lidos

A CSP parte de 100 e perde pontos por aquilo que realmente a enfraquece. 'unsafe-inline' no script-src efetivo custa 45 — mas apenas se não houver nonce nem hash, porque os navegadores que os compreendem ignoram então por completo o 'unsafe-inline'. 'unsafe-eval' custa 20. Um base-uri ausente custa 15: sem ele, um elemento <base> injetado reescreve todos os URL relativos da página, incluindo as origens dos scripts. Um object-src 'none' ausente custa 10. Content-Security-Policy-Report-Only sozinho obtém zero, porque nada é bloqueado — é um instrumento de medição, não uma defesa.

O HSTS é classificado por max-age: um ano ou mais chega a 80, seis meses a 60, menos do que isso 35, e max-age=0 obtém 0 porque desliga o HSTS. includeSubDomains acrescenta 20, e é essa soma que leva um cabeçalho correto a 100. Seis meses é também o mínimo da lista de pré-carregamento dos navegadores, pelo que um valor mais curto não pode ser pré-carregado, qualquer que seja a intenção.

A proteção contra enquadramento é satisfeita por CSP frame-ancestors com a nota máxima, ou por X-Frame-Options: DENY/SAMEORIGIN com 60 — continua a funcionar, mas a especificação avançou. ALLOW-FROM obtém 0: o Chrome nunca o implementou e o Firefox removeu-o na versão 70, pelo que uma página que dependa dele pode ser enquadrada.

A divulgação de versão é a única dedução. Server: Apache/2.4.41 e X-Powered-By: PHP/7.4.3 indicam a um atacante exatamente que CVE publicadas experimentar, e nenhum dos dois protege coisa alguma. Um valor sem versão como Server: cloudflare não é penalizado: a maioria das CDN envia-o sempre e não é possível removê-lo, pelo que pontuá-lo seria uma marca que ninguém consegue corrigir.

O que esta ferramenta não consegue ver

Os cabeçalhos são apenas uma camada. Uma pontuação perfeita não diz nada sobre a sua configuração TLS, sobre os atributos dos seus cookies, sobre se a autenticação é efetivamente imposta, ou sobre se a sua CSP autoriza uma origem que aloja ela mesma conteúdo controlado por um atacante.

Os atributos de Set-Cookie em particular não são classificados, porque são por cookie e não por resposta: um cookie de sessão sem HttpOnly e Secure é um problema sério que nenhuma classificação de cabeçalhos lhe mostrará.

A CSP é também classificada pela sintaxe e pelas palavras-chave, não pela sua lista de permissões. Uma política script-src 'self' https://cdn.example.com obtém a nota máxima, e se essa CDN servir JavaScript enviado por utilizadores a política não oferece proteção nenhuma. A nota mede a forma da política; as origens são para o utilizador julgar.

Exemplos

  • Verificar se uma alteração chegou à produção — classifique o URL antes e depois de uma mudança de configuração na CDN. Cabeçalhos definidos na origem são frequentemente removidos ou sobrepostos por um proxy, e esta é a forma mais rápida de ver a resposta tal como os navegadores a recebem.
  • Explicar um achado a uma equipa — as observações enunciam o mecanismo, o que convence mais do que um nome de cabeçalho numa folha de auditoria.
  • Verificar o destino de uma redireção — os cabeçalhos classificados são os da resposta final. Uma página de entrada que redireciona para outro anfitrião aterra muitas vezes num local sem nenhum dos cabeçalhos que o ponto de entrada tinha.
  • Antes de pedir o pré-carregamento de HSTS — a submissão exige um max-age de pelo menos um ano, mais includeSubDomains e preload. O pré-carregamento é difícil de desfazer, pelo que deve confirmar antes o cabeçalho em cada subdomínio.
  • Construir a própria política — o gerador de CSP monta o cabeçalho diretiva por diretiva, e cabeçalhos HTTP mostra a resposta completa em bruto quando precisa dos valores literais.

Observações

São classificados os cabeçalhos da resposta final. Se o URL redireciona, a classificação descreve onde se chega, e a cadeia é mostrada para detetar um ponto de entrada cujos cabeçalhos diferem do seu destino.

Feature-Policy é aceite em vez de Permissions-Policy para o mesmo ponto, já que alguns servidores continuam a emitir o nome antigo. Referrer-Policy obtém a nota máxima com no-referrer, same-origin, strict-origin e strict-origin-when-cross-origin; outros valores obtêm metade, porque deixam escapar mais do URL entre origens do que o necessário.

Apenas cabeçalhos. Esta ferramenta nunca recupera, guarda ou reencaminha o corpo da resposta, e os pedidos para endereços privados, de loopback, link-local e reservados são recusados antes de qualquer ligação — incluindo depois de uma redireção. Os detalhes estão na política de privacidade.

FAQ
Porque é que a minha pontuação é mais baixa do que noutros verificadores?
A maioria dos verificadores conta cabeçalhos. Este lê os seus valores. Uma CSP que contém 'unsafe-inline' sem nonce nem hash não impede a execução de um script injetado, e um cabeçalho HSTS com max-age=0 desativa o HSTS: ambos estão presentes e nenhum funciona. Presença e efeito são coisas distintas, e só o efeito merece ser pontuado.
O conteúdo da página é descarregado?
Não. O pedido é feito do lado do servidor e o corpo é cancelado assim que os cabeçalhos chegam. Nada da página é guardado nem devolvido, e endereços privados, de loopback e link-local são recusados antes de a ligação ser aberta.
As redireções são seguidas?
Até cinco saltos, e cada salto é revalidado com as mesmas regras de endereços, pelo que um URL público não pode redirecionar para a sua rede interna. Os cabeçalhos classificados são os da resposta final — normalmente o que se pretende, porque é essa a resposta que o navegador aplica.
A minha CSP tem 'unsafe-inline' mas também hashes. Isso é penalizado?
Não. Se o script-src contiver algum nonce ou hash sha256/384/512, os navegadores que os compreendem ignoram por completo o 'unsafe-inline'. É o caminho de migração previsto pela especificação, pelo que a combinação é classificada como estrita.
Porque é que o X-Frame-Options sozinho não obtém a nota máxima?
Porque a CSP frame-ancestors o substituiu. O X-Frame-Options continua a funcionar em todos os navegadores atuais, pelo que obtém 60 e não 0 — mas ALLOW-FROM obtém 0, porque nenhum navegador atual chegou a implementá-lo e uma página que dependa dele continua a poder ser enquadrada.
Que nota se deve procurar?
A significa que todos os cabeçalhos estão definidos e que cada valor cumpre a sua função. B e C indicam normalmente que falta um cabeçalho importante ou que um valor é permissivo. Abaixo disso, trate o relatório como uma lista de verificação e não como uma nota: as observações nomeiam a exposição concreta de cada ponto.