Content Security Policy y tu CMP: cómo hacer que CSP y consentimiento funcionen juntos

Dos capas de seguridad que tienen que ponerse de acuerdo

Una Content Security Policy (CSP) le dice al navegador desde qué orígenes puede una página cargar scripts, estilos, imágenes, frames y solicitudes de red. Una plataforma de gestión del consentimiento hace el trabajo contrario: decide cuáles de esos scripts pueden ejecutarse según la elección del usuario. Cuando ambas se configuran por separado, chocan. El CMP no se carga porque la CSP lo bloquea, o bien la CSP se relaja tanto para acomodar al CMP y a las etiquetas publicitarias que ya no protege nada.

Esta guía explica qué directivas de CSP suele necesitar un CMP, cómo interactúan los nonces con la inyección de scripts y cómo desplegar los cambios sin romper tu banner.

Lo que un CMP suele necesitar de la CSP

Los requisitos exactos dependen del proveedor, así que parte siempre de la documentación de tu propio CMP. En general, revisa estas directivas:

En los sitios con TCF, recuerda que el CMP también crea en la página un frame localizador llamado __tcfapiLocator. Ese frame se crea sin origen remoto, por lo que normalmente no necesita una entrada en frame-src, pero conviene confirmarlo durante las pruebas.

El problema del stub en línea

La mayoría de los CMP te piden colocar un pequeño script en línea — el stub — en el head de la página, para que otros scripts puedan poner llamadas en cola antes de que se cargue el CMP principal. Una CSP estricta bloquea los scripts en línea salvo que los permitas de forma explícita. Tienes tres opciones:

  1. Un nonce. Genera un valor aleatorio por respuesta, añádelo a la cabecera CSP como 'nonce-...' y a la etiqueta <script> del stub. Es la opción más flexible para páginas dinámicas.
  2. Un hash. Añade a script-src el hash SHA-256 del contenido exacto del stub. Funciona bien en sitios estáticos, pero cualquier cambio en el stub, incluso un espacio en blanco, lo rompe.
  3. Alojar el stub tú mismo como un archivo externo en tu propio dominio, cubierto por 'self'. Requiere cuidado para que se cargue lo bastante pronto.

Evita 'unsafe-inline' como atajo. Permite todos los scripts en línea, lo que elimina buena parte de la protección que ofrece la CSP.

Nonces y scripts que inyecta el CMP

Un CMP que bloquea scripts hasta obtener el consentimiento suele funcionar reteniéndolos e inyectándolos más tarde. Con una CSP basada en nonces, esos scripts inyectados también deben estar permitidos. Hay dos enfoques habituales:

Los gestores de etiquetas plantean la misma cuestión. Si cargas etiquetas de publicidad y analítica a través de un gestor de etiquetas, sigue su documentación sobre nonces y asegúrate de que el CMP y el gestor de etiquetas usan un enfoque coherente.

Las etiquetas publicitarias complican la CSP

La publicidad programática carga scripts y frames desde muchos dominios, y la lista cambia a medida que cambian los socios de demanda. Los publishers suelen tomar una de estas dos decisiones:

En cualquier caso, el CMP debe figurar en la lista de permitidos de forma explícita, no cubierto solo por un comodín, para que un cambio de CSP nunca desactive el banner en silencio.

Despliega con el modo report-only

Usa primero la cabecera Content-Security-Policy-Report-Only. El navegador informa de las infracciones sin bloquear nada, así que puedes ver qué rompería una política nueva.

  1. Despliega la política en modo report-only con un endpoint de informes.
  2. Carga páginas en perfiles de navegador limpios y recorre el flujo de consentimiento completo: primera visita, aceptar todo, rechazar todo, elección personalizada, retirada.
  3. Revisa los informes de infracciones y la consola del navegador en busca de recursos del CMP bloqueados.
  4. Ajusta la política y luego pasa al modo de aplicación.
  5. Mantén los informes activados después de aplicarla para detectar regresiones.

Síntomas de un conflicto con la CSP

Puntos clave

← Blog Leer todo →