/ TL;DR

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

  1. unsafe-inline no script-src — anula proteção contra XSS.
  2. data: no script-src — permite <script src="data:...">.
  3. * em vez de host específico — anula proteção.
  4. 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.

EV

Equipe Varredura

Time de pesquisa de segurança · Varredura

Sua app em produção passa por essa análise?

Rode uma varredura autônoma em ~60 segundos. Sem cadastro.

Analisar minha aplicação →