Cómo corregir un encabezado CSP (Content Security Policy) ausente | Scanthra
Mayo de 2026¿Qué es el encabezado CSP (Content Security Policy)?
CSP es un encabezado HTTP de respuesta que le dice al navegador exactamente qué fuentes de scripts, estilos, imágenes y frames puede cargar. Si algo en la página intenta cargar un script desde un dominio que no está en tu lista permitida, el navegador lo rechaza. Es como la lista de invitados para el portero de la entrada.
Sin CSP, cualquier etiqueta <script> inyectada — desde un
plugin hackeado, un error en un widget de terceros, un XSS almacenado en un comentario — se ejecuta
con acceso total a las cookies, datos de formularios y sesión de tus visitantes. Con una
CSP estricta, la misma inyección queda bloqueada silenciosamente y registrada.
Por qué esto importa para una pequeña empresa
Dos ejemplos del mundo real que vemos semanalmente en los informes de Scanthra:
- Skimming de tarjetas en cajas de pago — una biblioteca JavaScript comprometida en una tienda WooCommerce lee números de tarjeta y los exfiltra. Con CSP, esa solicitud de exfiltración a un dominio atacante queda bloqueada.
- Desfiguración y phishing con overlays — un script inyectado sustituye tu formulario de contacto por uno que envía los datos al atacante. CSP se negaría a cargar el script desconocido desde el principio.
CSP también es explícitamente recomendada por OWASP (estándar de seguridad de apps), esperada por la mayoría de los cuestionarios de ciberseguro, y — para empresas de la UE — una parte sensata de las «medidas técnicas adecuadas» exigidas por el RGPD Artículo 32 y la NIS2 (directiva UE de ciberseguridad).
El despliegue seguro: primero en modo solo reporte
La mayor razón por la que los sitios pequeños evitan CSP es el miedo a romper el diseño.
La solución: despliega primero Content-Security-Policy-Report-Only. El
navegador verifica la política e informa de las infracciones, pero no
las aplica. Observa los registros durante una semana, corrige lo que se bloquea y luego cambia al
encabezado que sí aplica.
Una política de inicio que funciona para la mayoría de sitios
Content-Security-Policy-Report-Only:
default-src 'self';
script-src 'self' https://www.googletagmanager.com https://www.google-analytics.com;
style-src 'self' 'unsafe-inline' https://fonts.googleapis.com;
font-src 'self' https://fonts.gstatic.com;
img-src 'self' data: https:;
connect-src 'self' https://www.google-analytics.com;
frame-ancestors 'none';
base-uri 'self';
form-action 'self';
upgrade-insecure-requests
Esta política asume que sirves todo desde tu propio dominio más Google Analytics + Google Fonts. Casi todos los sitios WordPress, Shopify o estáticos encajan aquí con pequeños ajustes. Elimina o reemplaza las líneas de GA/Fonts si no las usas.
Cómo desplegar en nginx
add_header Content-Security-Policy-Report-Only "default-src 'self'; script-src 'self' https://www.googletagmanager.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; img-src 'self' data: https:; frame-ancestors 'none'; base-uri 'self'; form-action 'self'; upgrade-insecure-requests" always;
Cómo desplegar en Apache
Header always set Content-Security-Policy-Report-Only "default-src 'self'; script-src 'self' https://www.googletagmanager.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; img-src 'self' data: https:; frame-ancestors 'none'; base-uri 'self'; form-action 'self'; upgrade-insecure-requests"
Cómo desplegar en Cloudflare
En tu panel de Cloudflare ve a Reglas → Reglas de transformación → Modificación de encabezados HTTP
de respuesta. Añade un encabezado llamado
Content-Security-Policy-Report-Only con la política anterior como
valor. Esta es la opción más rápida si no tienes acceso por shell a
tu servidor.
Cómo desplegar en WordPress
Instala un plugin de encabezados como Headers Security Advanced &
HSTS WP o añade los encabezados desde tu panel de alojamiento. Evita configurar CSP
dentro del functions.php de un tema — muchos temas cargan
activos del panel WP o del editor de bloques dinámicamente y eso rompe la experiencia del editor.
Problemas habituales
- Scripts en línea. Si tu CMS (gestor de contenidos) inyecta etiquetas
<script>en línea, verás infracciones. La solución es usar nonces (lo mejor) o, como medida temporal,script-src 'self' 'unsafe-inline'— pero planifica eliminar'unsafe-inline'en un sprint. - Google Tag Manager. GTM carga otros scripts en tiempo de ejecución desde hosts de terceros. Declara esos hosts en tu política o usa las Plantillas Personalizadas integradas de GTM con una estrategia de nonce.
- YouTube / Vimeo embebidos. Añade
frame-src https://www.youtube.com https://player.vimeo.com. - Endpoint de reporte. Añade
report-uri /csp-reportoreport-topara capturar las infracciones en el servidor. Algunos hosts (Cloudflare, Sentry) ofrecen endpoints gratuitos de reporte CSP.
De solo reporte a aplicación
Después de una semana en modo solo reporte sin nuevas infracciones en tráfico real, renombra
el encabezado de Content-Security-Policy-Report-Only a
Content-Security-Policy. La política ahora se aplica. Mantén
el endpoint de reporte — detectarás nuevas infracciones en el momento en que una actualización de plugin
introduzca un script inesperado.
Cómo Scanthra detecta esto
Nuestro módulo Encabezados de Seguridad hace una única solicitud GET a tu página de inicio
y lee los encabezados de respuesta. Si Content-Security-Policy
está ausente, es débil o contiene unsafe-eval, obtendrás un
problema detectado con gravedad, descripción en lenguaje claro y una solución lista para copiar —
el mismo formato que en este artículo.
¿Quieres saber si tu sitio tiene este problema?
Scanthra hace una revisión pasiva y amigable, y te envía por correo electrónico un informe de seguridad en PDF fácil de entender.
Analiza tu sitio gratis