Checklist de Cabeçalhos de Segurança HTTP (com Configurações Prontas)
Alguns cabeçalhos de resposta bloqueiam classes inteiras de ataques, como clickjacking, MIME sniffing, downgrade de protocolo e boa parte do XSS, com quase nenhum custo. Aqui estão os cabeçalhos que vale a pena enviar, valores iniciais seguros e como implantar o mais complicado (CSP) sem quebrar seu site.
O checklist
| Cabeçalho | Valor seguro | Protege contra |
|---|---|---|
Strict-Transport-Security | max-age=31536000; includeSubDomains | Downgrade para HTTP e roubo de cookies em Wi-Fi público |
Content-Security-Policy | Comece em modo report-only (veja abaixo) | XSS, scripts injetados, exfiltração de dados |
X-Content-Type-Options | nosniff | Navegadores executando uploads como scripts |
CSP frame-ancestors | 'self' (ou X-Frame-Options: SAMEORIGIN) | Clickjacking |
Referrer-Policy | strict-origin-when-cross-origin | Vazamento de URLs completas (tokens, IDs) para outros sites |
Permissions-Policy | camera=(), microphone=(), geolocation=() | Scripts de terceiros usando recursos do dispositivo |
Veja quais desses cabeçalhos seu site envia hoje, com nota, no Security Headers Checker.
HSTS: comece com um prazo curto
Assim que um navegador recebe o HSTS, ele recusa HTTP simples durante todo o max-age. Antes de tudo, garanta que todos os subdomínios funcionem em HTTPS (verifique os certificados com o SSL Checker), comece com max-age=300 e depois aumente para um ano. Adicione preload e envie para a lista de preload do HSTS somente quando tiver certeza, porque a remoção leva meses.
Content-Security-Policy sem quebrar nada
A CSP define de onde scripts, estilos, imagens e conexões podem vir. Implante em modo report-only, que registra as violações sem bloquear nada:
Content-Security-Policy-Report-Only: default-src 'self'; script-src 'self' https://www.googletagmanager.com; img-src 'self' data: https:; style-src 'self' 'unsafe-inline'; frame-ancestors 'self'; report-uri /csp-report
Acompanhe o console do navegador e seu endpoint de relatórios por uma semana, adicione as origens que você realmente usa e depois troque o nome do cabeçalho para Content-Security-Policy. Evite 'unsafe-inline' em scripts; use nonces ou hashes para os scripts inline que você controla. Monte a política origem por origem com o CSP Generator.
Configurações
Nginx (dentro de server; always mantém os cabeçalhos também nas páginas de erro):
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;
add_header Content-Security-Policy "frame-ancestors 'self'" always;
Apache (.htaccess, com mod_headers):
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
Header always set X-Content-Type-Options "nosniff"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
Header always set Permissions-Policy "camera=(), microphone=(), geolocation=()"
Vercel (vercel.json):
{ "headers": [ { "source": "/(.*)", "headers": [
{ "key": "Strict-Transport-Security", "value": "max-age=31536000; includeSubDomains" },
{ "key": "X-Content-Type-Options", "value": "nosniff" },
{ "key": "Referrer-Policy", "value": "strict-origin-when-cross-origin" }
] } ] }
Gere configurações completas de servidor com o Nginx Config Generator ou o .htaccess Generator.
Cabeçalhos que você pode descartar
X-XSS-Protection está obsoleto: os navegadores modernos removeram o filtro que ele controlava, e 0 é o valor recomendado caso você ainda o envie. Expect-CT foi descontinuado. Ocultar Server e X-Powered-By é uma boa prática de higiene, mas não é proteção real.