flawopen.com/XSS/CSP vs. escape
CSP e escape de saída: as duas defesas são necessárias?
A codificação contextual de saída coloca valores não confiáveis na página como dados, não como marcação executável. Uma Content Security Policy (CSP) é uma segunda proteção: como um porteiro que verifica quais scripts podem executar e para onde podem se conectar, ela pode bloquear alguns comportamentos injetados se houver uma falha de codificação. Ela não corrige a falha, e uma política permissiva talvez não bloqueie o script.
O que cada proteção faz
Codifique no ponto em que os dados entram no contexto de saída. Texto HTML, atributos entre aspas, JavaScript, CSS e componentes de URL têm regras de análise diferentes; o codificador correto depende do contexto exato. Prefira templates de framework e sinks DOM seguros, e evite colocar dados não confiáveis em contextos executáveis, como scripts inline ou atributos de eventos. Esta é a principal defesa contra XSS.
Uma Content-Security-Policy aplicada pode restringir scripts inline, origens de script e destinos como connect-src. Se a codificação falhar, uma política bem projetada pode bloquear um script ou uma conexão específica. O resultado depende da política e do navegador: CSP não garante bloquear todo payload, vazamento de dados ou script gadget, e a injeção permanece.
Por que CSP não substitui a codificação de saída
Uma política permissiva ou mal configurada pode deixar a injeção executável. Por exemplo, permitir 'unsafe-inline' enfraquece a proteção contra scripts inline; listas amplas de hosts também podem aceitar endpoints capazes de fornecer scripts. Diretivas CSP têm funções distintas: uma política que limita script-src ainda pode precisar de um connect-src deliberado para restringir destinos de rede. O cabeçalho Content-Security-Policy-Report-Only registra violações, mas não as bloqueia. Use codificação de saída como correção e CSP como defesa em profundidade.
Perguntas frequentes
Inventarie os scripts necessários e teste uma política baseada em nonce ou hash que evite 'unsafe-inline' e 'unsafe-eval'. Use Content-Security-Policy-Report-Only para detectar incompatibilidades; ela não aplica a política. Revise os relatórios, ajuste dependências legítimas e depois implante Content-Security-Policy em modo de aplicação. Mantenha a codificação contextual durante todo o processo.
Referências
- OWASP — guia de Content Security Policy
- OWASP — prevenção de Cross-Site Scripting
- MDN — implementação de Content Security Policy
- W3C — Content Security Policy Level 3