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)
AppSec

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
Baseline

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
Threat model

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
Deliverables

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)
Validation

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.

Trade-off

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.

Risk reduction

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' de style-src
  • Adicionar CSP Report-Only + endpoint de report (quando aplicável)
  • Adicionar monitoramento de erros JS em produção
  • Publicar security.txt no domínio
Roadmap