Content Security Policy e seu CMP: como fazer CSP e consentimento funcionarem juntos

Duas camadas de segurança que precisam concordar

Uma Content Security Policy (CSP) informa ao navegador de quais origens uma página pode carregar scripts, estilos, imagens, frames e requisições de rede. Uma plataforma de gerenciamento de consentimento faz o trabalho oposto: decide quais desses scripts podem ser executados com base na escolha do usuário. Quando as duas são configuradas separadamente, elas entram em conflito. O CMP não carrega porque a CSP o bloqueia, ou a CSP é afrouxada tanto para acomodar o CMP e as tags de anúncios que deixa de proteger qualquer coisa.

Este guia explica de quais diretivas de CSP um CMP normalmente precisa, como os nonces interagem com a injeção de scripts e como implantar mudanças sem quebrar seu banner.

O que um CMP geralmente precisa da CSP

Os requisitos exatos dependem do fornecedor, então parta sempre da documentação do seu próprio CMP. Em geral, verifique estas diretivas:

Em sites com TCF, lembre-se de que o CMP também cria na página um frame localizador chamado __tcfapiLocator. Esse frame é criado sem origem remota, então normalmente não precisa de uma entrada em frame-src, mas vale confirmar isso nos testes.

O problema do stub inline

A maioria dos CMPs pede que você coloque um pequeno script inline — o stub — no head da página, para que outros scripts possam enfileirar chamadas antes de o CMP principal carregar. Uma CSP rígida bloqueia scripts inline, a menos que você os permita explicitamente. Você tem três opções:

  1. Um nonce. Gere um valor aleatório por resposta, adicione-o ao cabeçalho CSP como 'nonce-...' e à tag <script> do stub. É a opção mais flexível para páginas dinâmicas.
  2. Um hash. Adicione a script-src o hash SHA-256 do conteúdo exato do stub. Funciona bem em sites estáticos, mas qualquer alteração no stub, até um espaço em branco, o quebra.
  3. Hospedar o stub por conta própria como um arquivo externo no seu domínio, coberto por 'self'. Exige cuidado para que ele carregue cedo o bastante.

Evite 'unsafe-inline' como atalho. Ele permite todos os scripts inline, o que elimina boa parte da proteção que a CSP oferece.

Nonces e scripts que o CMP injeta

Um CMP que bloqueia scripts até o consentimento costuma funcionar retendo-os e injetando-os depois. Com uma CSP baseada em nonce, esses scripts injetados também precisam ser permitidos. Há duas abordagens comuns:

Os gerenciadores de tags levantam a mesma questão. Se você carrega tags de anúncios e de analytics por meio de um gerenciador de tags, siga a documentação dele sobre nonces e garanta que o CMP e o gerenciador usem uma abordagem consistente.

As tags de anúncios dificultam a CSP

A publicidade programática carrega scripts e frames de muitos domínios, e a lista muda conforme os parceiros de demanda mudam. Os editores costumam fazer uma de duas escolhas:

Seja como for, o CMP deve estar na lista de permissões de forma explícita, e não coberto apenas por um curinga, para que uma mudança na CSP nunca desative o banner em silêncio.

Implante com o modo report-only

Use primeiro o cabeçalho Content-Security-Policy-Report-Only. O navegador relata as violações sem bloquear nada, então você pode ver o que uma nova política quebraria.

  1. Implante a política em modo report-only com um endpoint de relatórios.
  2. Carregue páginas em perfis de navegador limpos e percorra o fluxo de consentimento completo: primeira visita, aceitar tudo, rejeitar tudo, escolha personalizada, retirada.
  3. Revise os relatórios de violação e o console do navegador em busca de recursos do CMP bloqueados.
  4. Ajuste a política e depois passe para a aplicação efetiva.
  5. Mantenha os relatórios ativados após a aplicação para detectar regressões.

Sintomas de um conflito com a CSP

Principais conclusões

← Blog Ler tudo →