Security Headers
Security headers HTTP representam uma camada fundamental e frequentemente subutilizada de defesa para aplicações web modernas, funcionando como diretivas que instruem os navegadores a ativar mecanismos de proteção nativos contra uma ampla gama de vetores de ataque comuns. Estes cabeçalhos de resposta HTTP agem como uma política de segurança declarativa, estabelecendo regras sobre como o navegador deve processar e renderizar o conteúdo da página, controlar a execução de scripts, gerenciar cookies, e interagir com recursos de terceiros. Quando configurados adequadamente, headers como Content-Security-Policy (CSP), Strict-Transport-Security (HSTS), X-Frame-Options e X-Content-Type-Options criam barreiras significativas contra ataques de Cross-Site Scripting (XSS), clickjacking, MIME sniffing, downgrade de protocolo e injeção de código malicioso. A implementação correta desses cabeçalhos representa uma das formas mais eficientes de hardening de aplicações web, pois não requer mudanças no código da aplicação e oferece proteção imediata contra classes inteiras de vulnerabilidades. Estudos mostram que a grande maioria dos sites ainda não implementa adequadamente esses headers, deixando seus usuários expostos a ataques que poderiam ser mitigados com configurações relativamente simples no servidor web. Esta negligência é especialmente crítica considerando que ferramentas automatizadas de scanning de segurança avaliam a presença e configuração adequada desses headers como indicadores primários da postura de segurança de uma aplicação.
Content-Security-Policy (CSP)
CSP previne XSS definindo whitelist de fontes confiáveis para scripts, styles, images e outros recursos.
# CSP Strict (recomendado)
Content-Security-Policy:
default-src 'self';
script-src 'self' 'nonce-';
style-src 'self' 'nonce-';
img-src 'self' https: data:;
font-src 'self';
connect-src 'self' https://api.example.com;
frame-ancestors 'none';
base-uri 'self';
form-action 'self';
# CSP com report-only (testing mode)
Content-Security-Policy-Report-Only:
default-src 'self';
report-uri /csp-violation-report
CSP Directives Críticas
- default-src: Fallback para outras directives
- script-src: Whitelist para JavaScript execution
- style-src: CSS sources permitidas
- frame-ancestors: Previne clickjacking
- upgrade-insecure-requests: Force HTTPS
Strict-Transport-Security (HSTS)
HSTS força browsers a sempre usar HTTPS, prevenindo downgrade attacks e SSL stripping.
# HSTS com preload e subdomains
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
# Passos para HSTS preload:
1. Configurar HSTS header com preload
2. Submeter domínio em hstspreload.org
3. Domain será incluído em browser preload lists
X-Frame-Options
Previne clickjacking controlando se página pode ser renderizada em frame/iframe.
# Deny all framing (mais seguro)
X-Frame-Options: DENY
# Allow only same origin
X-Frame-Options: SAMEORIGIN
# Allow specific domain (deprecated - use CSP frame-ancestors)
X-Frame-Options: ALLOW-FROM https://trusted.com
X-Content-Type-Options
Previne MIME sniffing attacks forçando browser a respeitar Content-Type declarado.
# Disable MIME sniffing
X-Content-Type-Options: nosniff
Referrer-Policy
Controla quanto de referrer information é enviado em requests.
# Recommended policy
Referrer-Policy: strict-origin-when-cross-origin
# Options:
# - no-referrer: Never send referrer
# - no-referrer-when-downgrade: No referrer on HTTPS→HTTP
# - same-origin: Only send to same origin
# - strict-origin: Only send origin (no path)
Permissions-Policy
Controla quais browser features e APIs a página pode usar (substitui Feature-Policy).
# Disable dangerous features
Permissions-Policy:
geolocation=(),
microphone=(),
camera=(),
payment=(),
usb=(),
interest-cohort=()
Configuração por Servidor
Nginx
# nginx.conf
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
add_header X-Frame-Options "DENY" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Content-Security-Policy "default-src 'self';" always;
add_header Permissions-Policy "geolocation=(), microphone=(), camera=()" always;
Apache
# .htaccess or httpd.conf
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
Header always set X-Frame-Options "DENY"
Header always set X-Content-Type-Options "nosniff"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
Header always set Content-Security-Policy "default-src 'self';"
Node.js/Express
// Use Helmet middleware
const helmet = require('helmet');
app.use(helmet());
// Custom configuration
app.use(helmet.contentSecurityPolicy({
directives: {
defaultSrc: ["'self'"],
scriptSrc: ["'self'", "'nonce-'"],
styleSrc: ["'self'", "'nonce-'"],
}
}));
Testing Security Headers
- securityheaders.com: Scan e grade A+ rating
- Mozilla Observatory: Comprehensive analysis
- Chrome DevTools: Network tab → Headers
- curl:
curl -I https://example.com
Common Pitfalls
- CSP muito permissivo com 'unsafe-inline' e 'unsafe-eval'
- HSTS sem includeSubDomains deixa subdomains vulneráveis
- Headers configurados mas não aplicados (always flag missing)
- Testar apenas homepage - headers devem estar em todas as páginas
Checklist Completo
- [OK] Content-Security-Policy strict configurado
- [OK] HSTS com max-age 1 ano + includeSubDomains
- [OK] X-Frame-Options: DENY ou CSP frame-ancestors
- [OK] X-Content-Type-Options: nosniff
- [OK] Referrer-Policy configurado
- [OK] Permissions-Policy desabilitando features não usadas
- [OK] Headers testados em securityheaders.com (A+ rating)
- [OK] CSP testado com report-only mode primeiro
