FlawOpen

flawopen.com/XSS/CSP vs. escape

CSP e escape de saída: as duas defesas são necessárias?

Página de referência
Resposta curta

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

A codificação contextual previne a injeção

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 CSP aplicada pode limitar alguns comportamentos injetados

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

Como implantar uma CSP mais restrita?

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

Veja também Cross-Site Scripting (XSS, CWE-79): como funciona e como evitar em todas as linguagens — flawopen.com dangerouslySetInnerHTML do React é seguro? DOMPurify basta para proteger innerHTML? Markdown é seguro contra XSS? Svelte é seguro contra XSS por padrão? Upload de SVG pode causar XSS? Risco de XSS no Vue v-html