Content Security Policy protege contra XSS quando bem configurado e quebra o site quando mal configurado. Guia prático de como implementar CSP em app rodando sem tomar downtime.
Content Security Policy é o header mais poderoso e mais mal compreendido em segurança web. Bem feito, elimina XSS. Mal feito, quebra o site.
O modelo mental
CSP diz ao browser: "só carregue recursos destas fontes". Se um <script> aparecer que não bate, o browser bloqueia.
Passo 1: modo Report-Only
Nunca comece direto em modo bloqueante. Use Content-Security-Policy-Report-Only primeiro. Colete violações por 1-2 semanas. Analise. Ajuste.
Content-Security-Policy-Report-Only: default-src 'self'; report-uri /csp-report
Passo 2: analise violações
Vai ter dezenas. Categorize:
- Google Analytics
- Hotjar
- Fontes externas
- Chat widgets
- Pixels de marketing
Cada categoria vira uma entrada na policy.
Passo 3: escreva policy realista
Exemplo para app típico com GA + Hotjar:
default-src 'self';
script-src 'self' 'nonce-{RANDOM}' https://static.hotjar.com https://www.googletagmanager.com;
style-src 'self' 'unsafe-inline' https://fonts.googleapis.com;
img-src 'self' data: https:;
font-src 'self' https://fonts.gstatic.com;
connect-src 'self' https://static.hotjar.com https://www.google-analytics.com;
frame-ancestors 'none';
base-uri 'self';
form-action 'self';
Passo 4: nonce em vez de unsafe-inline para script
Todo <script> inline recebe atributo nonce="{RANDOM}". O random muda a cada request. Atacante não consegue prever, então o inline dele é bloqueado.
Passo 5: teste
- Fluxo de checkout funciona?
- Login com Google funciona?
- Widget de chat funciona?
- Report de erro funciona?
Passo 6: publique em modo bloqueante
Só depois de 1 semana sem violações no report-only, mude para Content-Security-Policy.
Erros comuns
unsafe-inlinenoscript-src— anula proteção contra XSS.data:noscript-src— permite<script src="data:...">.*em vez de host específico — anula proteção.- Domínios CDN antigos deixados por precaução.
O que ganha
Um app com CSP bem feito converte 60-80% dos XSS conhecidos em nada (browser bloqueia). É a segunda linha de defesa quando a primeira (sanitização) falhou.
TL;DR
- Comece em Report-Only por 1-2 semanas.
- Analise violações e monte policy realista.
- Nonce em vez de unsafe-inline.
- Só publique bloqueante depois de zero violação legítima.
A Varredura verifica CSP como parte da varredura de headers. Rodar agora.
Sua app em produção passa por essa análise?
Rode uma varredura autônoma em ~60 segundos. Sem cadastro.