El equipo de seguridad cierra una auditoría con una recomendación clara: desplegar una estricta Política de Seguridad de Contenidos. El desarrollador añade el encabezado a producción un viernes por la tarde. Veinte minutos más tarde, el pago de Stripe ya no se carga, Google Tag Manager está en silencio y el back office de administración muestra una página en blanco. Reversión del encabezado, post-mortem tenso, promesa de "reanudarse más tarde", lo que se convierte en nunca.
Un CSP bien dirigido no es un cambio. Esta es una lista blanca ejecutable: el navegador solo ejecuta lo que usted permite explícitamente para scripts, estilos, imágenes, conexiones XHR e iframes. Cada píxel de marketing, cada paquete web, cada iframe de pago cuenta, incluido el que nadie ha inventariado desde la última campaña.
La compilación correcta se realiza solo en informes, con marketing en el ciclo, un proceso nonce en el lado de la compilación y una prueba de pago completa antes de pasar a implementar. Sin él, castigas a la canasta, no al atacante XSS.
Lanzamiento en cuatro fases
Fase 1: inventario: enumera todos los scripts y estilos, incluidos los inyectados por Tag Manager, pruebas A/B, soporte por chat y mapas de calor. Exporte infracciones desde el navegador (pestaña Red + consola) en rutas críticas: recepción, registro, pago, administración.
Fase 2: Solo informe de dos a cuatro semanas: encabezado Content-Security-Policy-Report-Only con punto final /csp-report o servicio de terceros. Recopilar, agregar por directiva violada, ordenar: script-src primero, luego connect-src, frame-src, img-src.
Fase 3: correcciones: nonce por consulta para archivos legítimos en línea, hash SHA-256 para fragmentos estáticos, refactorización a archivos externos para el resto. Cada nuevo dominio de marketing pasa por un ticket de CSP antes de poner la etiqueta en producción.
Fase 4: hacer cumplir con monitoreo: cambiar a "Política de seguridad de contenido" cuando las infracciones críticas tiendan a cero durante siete días consecutivos. Planifique el encabezado de reversión documentado (marca de función o configuración de nginx) y la prueba de pago E2E en la etapa de preparación antes de la producción.
Pautas y errores comunes
| Directiva | Rol | Trampa para correr |
|---|---|---|
fuente-predeterminada | Reserva | Demasiado permisivo oculta agujeros en script-src |
script-src | JavaScript | Olvídese de js.stripe.com o GTM |
estilo-src | CSS | React/Vue en línea sin nonce |
conectar-src | buscar/XHR | API de pago o análisis olvidada |
marco-src | marcos flotantes | 3-D Secure Stripe bloqueado |
img-src | Fotos | Seguimiento de píxeles en dominio desconocido |
``estrictamente dinámico'' con nonce moderniza la cadena de confianza: un script nonce puede cargar descendientes: prueba de destino Safari y Firefox, no sólo Chrome.
unsafe-inline y unsafe-eval solo son aceptables en transiciones breves y documentadas. Cada ocurrencia debe tener una fecha de eliminación.
Tubería nonce y construcción
El marco genera un nonce por solicitud (sesión o middleware). La plantilla inyecta <script nonce="{{nonce}}">. La herramienta de compilación conserva el marcador de posición; la minificación no debería romperlo.
Para contenido en línea inmutable (heredado de análisis de fragmentos), calcule el hash SHA-256 y declare 'sha256-…' en script-src. Documente el comando de compilación en el archivo README de operaciones.
Puesta en escena de CI: prueba automatizada de que el encabezado CSP está presente y que la página de pago se carga sin infracción de la consola. Bloquear fusión si hay regresión.
Terceros: Stripe, GTM, analítica
Stripe normalmente requiere script-src js.stripe.com, frame-src hooks.stripe.com, connect-src api.stripe.com. Enumérelos explícitamente; no confíe únicamente en "default-src".
Google Tag Manager propaga dominios variables: impone un proceso de “nueva etiqueta = revisión de CSP” con SLA de 48 horas. De lo contrario, la campaña del lunes se interrumpirá el martes.
Después de cada cambio de encabezado, ejecute una ejecución de pago completa con la tarjeta de prueba, 3-D Secure si está activado y la confirmación del webhook del lado del servidor.
Gobernanza y presentación de informes
Nombre un propietario de CSP en la matriz RACI de seguridad, no un comité vago. Participa en comunicados de marketing de etiquetas.
Agregación semanal de informes exclusivos: volumen por directiva, nuevos dominios, páginas asignadas. Spike después de la implementación = reversión o revisión, no silencio.
GDPR: los informes de CSP pueden contener URL con parámetros: filtrar o anonimizar antes del almacenamiento a largo plazo.
Decide y avanza sin puntos ciegos
- Inventario de scripts y estilos: compilación, en línea, Tag Manager, Stripe; propietario CSP nombrado en el RACI.
- Solo informe de 2 a 4 semanas: tasa de endpoint
/csp-reportlimitada, clasificación de script-src semanal. - Pipeline nonce o CI hash: la puesta en escena se aplica antes de la producción; pago de prueba y administrador de WordPress.
- Nuevo formulario de marketing de etiquetas: dominios script/connect/frame revisados 48 horas antes de la publicación.
- Cumplimiento del cuadro de mando: cero infracciones críticas durante 7 días, encabezado de reversión documentado.
Frontal y CDN: verifique los encabezados mediante curl -I; compare hosts a través del directorio y el comparador.
Preguntas frecuentes
¿Qué bloques CSP exactamente?
Limita las fuentes ejecutables (scripts, estilos, conexiones, marcos) para reducir el impacto de una inyección XSS. El navegador rechaza todo lo que no esté en la lista blanca, incluido un píxel de marketing olvidado.
¿Solo informar es suficiente por mucho tiempo?
No: esta es la fase de inventario (mínimo de 2 a 4 semanas). Las infracciones deben acercarse a cero en las rutas críticas antes de aplicarse en producción.
¿Cómo gestionar scripts en línea?
Tres formas: nonce único por solicitud inyectada por el marco, hash SHA-256 de contenido estático o refactorización a archivos externos. "unsafe-inline" solo es aceptable en transiciones cortas.
¿Coexisten Stripe y Tag Manager con CSP?
Sí, con script-src y connect-src enumerando js.stripe.com, dominios GTM y API de pago. Pruebe el pago completo después de cada cambio de encabezado.
Lea dos semanas de informes de CSP antes de prohibir: las sorpresas provienen del marketing, no del backend.
