Pular para o conteúdo principal

CSP estrita não permite avaliação insegura

Última atualização em 06 de ago. de 20262 min de leitura

O que isso significa?​

Content Security Policy (CSP) é uma política de segurança que instrui os navegadores sobre quais tipos de código podem ser executados numa página web. A diretiva unsafe-eval controla especificamente se o JavaScript pode ser gerado dinamicamente e executado em tempo de execução, por exemplo via eval() ou o construtor Function(). Uma CSP estrita que não permite unsafe-eval bloqueia precisamente este tipo de execução dinâmica de código no navegador. Isto aplica-se não só ao próprio código do website, mas também a ferramentas externas que recarregam e executam conteúdo em tempo de execução, como é o caso das ferramentas de testes A/B no lado do cliente.

A criação e entrega funcionam mesmo sem unsafe-eval?​

Não, tecnicamente falando, não é possível criar e entregar experimentos sem unsafe-eval. A razão está na forma como o próprio snippet funciona: os experimentos não são incorporados estaticamente quando a página é implementada, mas sim recuperados pelo snippet como uma configuração em tempo de execução e executados no navegador por um motor JavaScript. É precisamente isso que torna possível criar ou editar um experimento no dashboard sem exigir uma nova implementação por parte do cliente.

No entanto, uma CSP só pode permitir código que conheça previamente, através de uma fonte fixa, um hash ou um nonce. Nenhum destes métodos funciona para conteúdo que só é montado após o carregamento da página. Para que o navegador execute este código de qualquer forma, precisa do eval() ou do construtor Function()—precisamente o que o unsafe-eval controla. Como a lógica de segmentação e as alterações de conteúdo passam pelo mesmo motor, não existe um caminho de execução separado e "seguro" que pudesse ser ativado apenas para experimentos simples (texto, CSS, imagens).

Possível Solução​

Em vez de permitir unsafe-eval em todo o site, a CSP pode ser configurada de forma diferente para cada rota. Páginas com requisitos particularmente rigorosos (por exemplo, fluxos de login ou autenticação) permanecem estritamente livres de eval, enquanto o unsafe-eval só é permitido nas páginas onde os experimentos são efetivamente destinados a correr.