SeguridadTu web expuesta: CSP o el Riesgo Invisible
Seguridad
STT// ONLINE

Tu web expuesta: CSP o el Riesgo Invisible

USR//AldeaCode Architecture
DAT//
LOC//ES

1. El Abismo de la Confianza Ciega: Por qué necesitas CSP

Imagina que tu aplicación web es una fortaleza. Tienes firewalls, bases de datos encriptadas y autenticación robusta. Sin embargo, has dejado la puerta principal abierta a cualquiera que lleve una etiqueta <script>.

Tradicionalmente, el navegador confía en cualquier cosa que se le pida ejecutar. Si un atacante logra inyectar una sola línea de JavaScript a través de un comentario en un blog, un parámetro URL mal sanitizado o una dependencia de terceros comprometida, el navegador la ejecutará con los mismos privilegios que tu código original.

La Analogía del Caballo de Troya

Incluir scripts de terceros sin CSP es como contratar a un guardia de seguridad (SDK de analíticas, píxel de Facebook, etc.) y darle las llaves maestras de la caja fuerte. CSP es el control de acceso que verifica las credenciales de cada recurso antes de dejarlo pasar.


Web Sin CSP (Insegura)

  • Ejecución de Scripts Inline arbitrarios.
  • Exfiltración de datos vía Form Action maliciosos.
  • Inyección de frames para ataques de Clickjacking.
  • Carga de imágenes desde dominios de Tracking/Ciberespionaje.

🛡️ Web Con CSP Nivel 3

  • Uso de Nonces: Solo se ejecuta el JS autorizado.
  • strict-dynamic: Confianza heredada para scripts legítimos.
  • Control total sobre Data Exfiltration (connect-src).
  • Cumplimiento del Principio de Responsabilidad Proactiva.

Muchos CTOs cometen el error de pensar que CSP es “un extra”. La Agencia Española de Protección de Datos (AEPD) no lo ve así.

Bajo el Artículo 32 del RGPD, los responsables del tratamiento deben “aplicar medidas técnicas y organizativas apropiadas para garantizar un nivel de seguridad adecuado al riesgo”. Si tu aplicación maneja datos personales (emails, nombres, tarjetas) y sufres un ataque XSS que podría haber sido mitigado por una CSP básica, estás en una posición de negligencia técnica.

La Sanción Invisible

Un ataque de Magecart (donde se inyecta JS para robar datos de tarjetas en el checkout) es virtualmente imposible en un sitio con una directiva connect-src y script-src bien configurada. No tenerla no solo te expone al hacker, sino a multas que pueden alcanzar el 4% de la facturación global.


Anatomía de una Petición con Defensa Activa

01

Request

Cliente pide index.html

02

Header CSP

Servidor envía la política

03

Audit

Browser verifica Nonces/DOM

04

Execution

Solo corre lo autorizado


3. Directivas Fundamentales: El Diccionario de Control

CSP funciona a través de directivas. Cada una controla un tipo específico de recurso. Aquí está el desglose técnico para 2026:

  1. default-src 'none': El punto de partida Zero Trust. Si no autorizas algo explícitamente, se bloquea. Es la configuración más agresiva pero la más segura.
  2. script-src: La joya de la corona. Aquí definimos qué JS se ejecuta. En 2026, olvida las listas blancas de dominios. usa Nonces o Hashes.
  3. connect-src: Crucial para el cumplimiento del RGPD. Controla a dónde puede tu web enviar datos (Fetch, XHR, WebSockets). Si un script malicioso intenta enviar las cookies de sesión a hacker.com, esta directiva lo detendrá en seco.
  4. img-src: Evita que se carguen “píxeles espía” o imágenes maliciosas que puedan explotar vulnerabilidades en el renderizado del navegador.
  5. frame-ancestors: La evolución de X-Frame-Options. Define quién puede embeber tu sitio en un iframe, protegiéndote contra Clickjacking.

Configuración de Trinchera v3.0
01 Content-Security-Policy:
02 default-src 'none';
03 script-src 'nonce-TOKEN_ALEATORIO' 'strict-dynamic' 'unsafe-inline' https:;
04 connect-src 'self' https://api.aldeacode.com https://vitals.vercel-insights.com;
05 img-src 'self' data: https://images.aldeacode.com;
06 style-src 'self' 'unsafe-inline' https://fonts.googleapis.com;
07 font-src 'self' https://fonts.gstatic.com;
08 base-uri 'none';
09 form-action 'self';
10 frame-ancestors 'none';
11 upgrade-insecure-requests;

4. Evolución: Del ‘Whitelisting’ al ‘Strict CSP’

Históricamente, los desarrolladores pasaban horas manteniendo listas gigantescas de dominios autorizados: https://www.google.com, https://cdn.jsdelivr.net, etc. Este enfoque falló por dos razones:

  1. Mantenimiento: Si un CDN cambiaba su subdominio, la web se rompía.
  2. Bypass: Si un dominio de la lista (como ajax.googleapis.com) alojaba una librería vulnerable, el atacante podía usar esa librería para saltarse la CSP.

La Revolución de ‘strict-dynamic’

Introducido en CSP Nivel 3, 'strict-dynamic' dice: “Si yo he autorizado explícitamente a un script (mediante un Nonce), confío en cualquier otro script que ese script cargue”. Esto simplifica drásticamente el despliegue de analíticas sociales y herramientas de tracking pesadas sin comprometer la seguridad.


5. Casos Reales: El Coste de no tener CSP

El Incidente de British Airways (2018)

Un grupo de hackers (Magecart) inyectó 22 líneas de código en el script de limpieza de la maleta de BA. El código capturaba los datos del formulario de pago y los enviaba a un servidor externo. Con una directiva connect-src 'self', el navegador habría bloqueado la exfiltración de los datos. El resultado: una multa inicial de 183 millones de libras.

Ataques “Zero-Day” en Extensiones

A veces el ataque no viene de tu código, sino de una extensión de Chrome maliciosa instalada por el usuario. Estas extensiones pueden inyectar scripts en cualquier página. Una CSP estricta bloquea la ejecución de estos scripts externos inyectados, protegiendo al usuario incluso de sí mismo.


Guía de Implementación por Stack

NEXT.JS
Usa `middleware.ts` para generar un Nonce único por petición y pásalo al `NextResponse` header.
ASTRO
Implementa `astro-shield`. Genera hashes de tus scripts críticos durante el build time para sitios estáticos invulnerables.
NGINX
Usa la directiva `add_header Content-Security-Policy ....` para sitios legacy. Asegúrate de incluir el flag `always`.

6. Preguntas Frecuentes (FAQ) sobre CSP

¿CSP afecta negativamente al rendimiento (LCP/CLS)?

No en el renderizado, pero sí en el flujo de carga. Sin embargo, tener una CSP ayuda a evitar que scripts de baja calidad de terceros inyecten layouts inesperados, lo que a menudo mejora el Cumulative Layout Shift (CLS).

¿Cómo puedo probar CSP sin romper mi producción?

Usa la cabecera Content-Security-Policy-Report-Only. El navegador te enviará alertas de violaciones a tu endpoint de reporting sin bloquear nada. Deja esta cabecera activa durante una semana antes de pasar a modo bloqueante.

¿Qué hago si mi CRM necesita 'unsafe-inline'?

Refactoriza. La mayoría de CRMs modernos soportan carga asíncrona legítima. Si es inevitable, usa un Hash de integridad para ese script específico en lugar de abrir la puerta a todo el inline.

¿Es CSP compatible con Google Analytics 4?

Sí. Usando `strict-dynamic` y autorizando a GTM, Google Analytics funcionará perfectamente. Debes autorizar `https://www.google-analytics.com` en `connect-src` e `img-src`.

¿Por qué Safari bloquea cosas que Chrome permite?

Safari (WebKit) tiene una implementación más estricta de algunas directivas de privacidad. Siempre verifica tus políticas en Safari para iOS antes de darlas por válidas.

¿Qué es el reporting y por qué es vital?

Sin reporting estás ciego. Directivas como `report-to` envían un JSON a tu servidor cada vez que alguien (hacker o usuario) dispara una violación de política.

¿Afecta CSP a los anuncios (Ads)?

Sí. Las redes de anuncios son dinámicas y cargan scripts de mil dominios. Aquí es donde `'strict-dynamic'` es obligatorio para evitar que la web deje de generar ingresos.

¿Puede una CSP mitigar ataques de red local?

No. CSP protege la capa de aplicación en el navegador. No es un sustituto de TLS o de una configuración de red segura.