Una CSP estricta no permite la evaluación insegura
¿Qué significa esto?
Content Security Policy (CSP) es una política de seguridad que indica a los navegadores qué tipos de código se permite ejecutar en una página web. La directiva unsafe-eval controla específicamente si el JavaScript puede generarse y ejecutarse dinámicamente en tiempo de ejecución, por ejemplo mediante eval() o el constructor Function(). Una CSP estricta que no permite unsafe-eval bloquea precisamente este tipo de ejecución dinámica de código en el navegador. Esto se aplica no solo al propio código del sitio web, sino también a herramientas externas que recargan y ejecutan contenido en tiempo de ejecución, como es el caso de las herramientas de A/B testing del lado del cliente.
¿Funciona la creación y entrega incluso sin unsafe-eval?
No, técnicamente hablando, crear y entregar experimentos no es posible sin unsafe-eval. La razón radica en cómo funciona el snippet en sí: los experimentos no se incrustan de forma estática cuando se despliega la página, sino que el snippet los recupera como una configuración en tiempo de ejecución y un motor de JavaScript los ejecuta en el navegador. Esto es precisamente lo que permite crear o editar un experimento en el dashboard sin necesidad de un nuevo despliegue por parte del cliente.
Sin embargo, una CSP solo puede permitir código que conoce de antemano, mediante una fuente fija, un hash o un nonce. Ninguno de estos métodos funciona para contenido que se ensambla solo después de que la página se ha cargado. Para que el navegador ejecute este código de todos modos, necesita eval() o el constructor Function()—precisamente lo que controla unsafe-eval. Dado que la lógica de segmentación y los cambios de contenido se ejecutan a través del mismo motor, no existe una ruta de ejecución separada y «segura» que pudiera habilitarse solo para experimentos simples (texto, CSS, imágenes).
Posible solución
En lugar de permitir unsafe-eval en todo el sitio, la CSP puede configurarse de forma diferente para cada ruta. Las páginas con requisitos particularmente estrictos (por ejemplo, flujos de inicio de sesión o autenticación) permanecen estrictamente «libres de eval», mientras que unsafe-eval solo se permite en las páginas donde realmente están previstos ejecutarse los experimentos.