Case Study
Hardening do Portfólio (AppSec • Vercel)
Case de Application Security aplicado a um site estático: hardening com Security Headers, CSP e HSTS para reduzir riscos comuns (ex.: clickjacking, MIME sniffing e exposição via headers), com decisões documentadas e validação prática.
Resumo (executivo)
- Objetivo: reduzir superfície de ataque e estabelecer baseline AppSec
- Entrega: headers + CSP + documentação de trade-offs + validação
- Resultado: política restritiva sem quebrar UX (navegação/recursos locais)
Stack & Contexto
Vercel • Site estático • Security Headers • CSP • HSTS • Permissions-Policy
- Escopo: camada cliente/CDN (sem backend)
- Foco: proteção do browser + redução de vetores comuns
Ameaças consideradas
- Clickjacking: páginas embutidas via iframe para enganar usuário
- MIME sniffing: interpretação incorreta de conteúdo e risco de execução
- Mixed content / downgrade: mitigado via HTTPS + HSTS
- Supply chain (scripts externos): mitigado restringindo
script-src - Exposição de contexto via referrer: mitigada com
Referrer-Policy
Controles implementados
- X-Content-Type-Options:
nosniff - X-Frame-Options:
DENY - Referrer-Policy:
strict-origin-when-cross-origin - Permissions-Policy:
camera=(), microphone=(), geolocation=() - Strict-Transport-Security (HSTS):
max-age=63072000; includeSubDomains; preload - Content-Security-Policy (CSP):
default-src 'self'+ restrições por tipo
Entregáveis
- Baseline de headers documentado
- CSP aplicada com escopo claro
- Trade-offs registrados (compatibilidade vs restrição)
- Checklist de validação pós-change
Como eu validei
- DevTools → Network → Response Headers
- Console: ausência de violações de CSP
- Teste de navegação/recursos locais (sem quebra de UX)
Decisões e trade-offs
CSP com compatibilidade
Mantive 'unsafe-inline' em style-src para evitar quebra de estilos.
Próximo passo: remover a exceção migrando para classes e evitando estilos inline.
Sem scripts externos
Mantive script-src 'self' para bloquear terceiros e reduzir risco de supply chain.
Isso simplifica validação e mantém a política mais previsível.
Limitações e próximos passos
Limitações
- Site estático (sem backend) — não cobre controles server-side
- Proteções dependem do suporte do navegador
- Sem endpoint de reporting para CSP (por enquanto)
Próximos passos
- Remover
'unsafe-inline'destyle-src - Adicionar CSP Report-Only + endpoint de report (quando aplicável)
- Adicionar monitoramento de erros JS em produção
- Publicar
security.txtno domínio