Defaults.Exposed

Defaults.ExposedSoluciones › Content-Security-Policy (CSP)

Cómo arreglar Content-Security-Policy (CSP)

Una Política de Seguridad de Contenido es una regla de seguridad que tu web entrega al navegador de cada visitante, indicándole exactamente qué código tiene permiso para ejecutarse. Sin ella, si algo malicioso aterriza alguna vez en una página —a través de un cuadro de comentarios, un complemento pirateado o un script de terceros—, el navegador lo ejecutará sin restricciones, incluido el código que copia en silencio los números de tarjeta y las contraseñas de tus clientes mientras los escriben, con el candado aún visible.

En resumen, para tu negocio: Si tu web es manipulada alguna vez, el código malicioso puede leer los datos de tarjeta y de inicio de sesión de tus clientes directamente de tu propio pago mientras todo parece completamente normal, dejándote con devoluciones de cargo, reclamaciones de fraude, una brecha de datos notificable y un suspenso en la comprobación que los equipos de seguridad de los clientes mayores usan para atascar o tumbar un acuerdo.

Lo que esto te puede costar

Por qué importa. El candado demuestra que la conexión a tu web es privada, pero no hace nada por controlar qué código se ejecuta una vez que un visitante está en la página. Una Política de Seguridad de Contenido es la salvaguarda que sí lo hace: le dice a los navegadores que ignoren cualquier script que no venga de una fuente en la que confías, para que un único campo, anuncio o complemento manipulado no pueda convertirse en una herramienta para robar el dinero y los datos de tus clientes. Es una comprobación calificada en tu informe, vale puntos de verdad, y es de las primeras cosas que busca una revisión de seguridad profesional.

Qué es esto, en palabras sencillas

Cuando alguien visita tu web, su navegador descarga tu página y ejecuta el código que haya en ella: los scripts que hacen desplegarse los menús, funcionar los botones, enviarse los formularios de pago, y demás. Por defecto, el navegador confía en todo ello. No tiene forma de saber qué código es genuinamente tuyo y cuál coló otra persona.

Una Política de Seguridad de Contenido (a menudo abreviada como CSP) es una breve lista de reglas que tu web adjunta a cada página, indicándole al navegador: «ejecuta solo código de estas fuentes que he aprobado, y rechaza todo lo demás». Es la diferencia entre una discoteca que deja entrar a cualquiera y una con una lista de invitados en la puerta.

La razón por la que esto importa tanto es que las webs son manipuladas constantemente, no siempre pirateando tu servidor, sino a través de las puertas traseras que la mayoría de las webs dejan abiertas: un campo de comentarios, un cuadro de búsqueda, un complemento desactualizado, un script de terceros para anuncios o analíticas, o un widget de chat. Si un atacante consigue meter siquiera una línea de su propio código en una de tus páginas, el navegador la ejecuta como si fuera tuya. A partir de ahí puede leer todo lo que tus clientes escriben —números de tarjeta, contraseñas, direcciones— y enviarlo en silencio a otro sitio. Una Política de Seguridad de Contenido cierra esa puerta negándose a ejecutar nada de una fuente que no aprobaste.

Lo que esto te puede costar

Esto no es abstracto. El ataque que una Política de Seguridad de Contenido previene —código inyectado en una página que roba datos de tus propios clientes— está detrás de algunas de las mayores brechas de robo de tarjetas registradas. Así es como tiende a desarrollarse para una empresa normal:

Qué es en realidad (el detalle)

Una Política de Seguridad de Contenido se entrega como una única cabecera de respuesta HTTP: una línea que tu servidor web envía con cada página. Su valor es un conjunto de directivas, cada una nombrando un tipo de contenido y las fuentes permitidas para él. Por ejemplo:

Content-Security-Policy: default-src 'self'; script-src 'self'; object-src 'none'; frame-ancestors 'self'

En términos sencillos, eso dice: por defecto carga solo cosas de mi propia web; ejecuta solo scripts de mi propia web; no permitas complementos de estilo antiguo; y no dejes que otras webs incrusten la mía en un marco.

Cómo se ve lo «bueno». Nuestra comprobación no solo busca la presencia de la cabecera: lee la política directiva por directiva y puntúa lo fuerte que es de verdad, como lo haría un revisor de seguridad. Una política fuerte:

Una política que existe pero se apoya en 'unsafe-inline', 'unsafe-eval' o comodines puntuará igualmente mal, porque en la práctica ofrece poca protección real. El objetivo es una política ajustada, no una política cualquiera.

Cómo solucionarlo (gratis, ~1–2 horas)

Pásale esto a tu informático o a quien lleve tu web: la solución en sí es completamente gratis. Solo cobramos por vigilar que se mantenga en su sitio y correcta con el tiempo; activarla no cuesta nada. La razón por la que esto lleva una hora o dos en lugar de minutos es el cuidadoso paso de prueba que evita que bloquee por accidente partes de tu propia web.

  1. Empieza en modo de solo informe — no impongas todavía. Añade una cabecera de respuesta Content-Security-Policy-Report-Only. Esto observa y registra lo que se bloquearía sin bloquear nada de verdad, para que la web en vivo siga funcionando mientras aprendes de qué depende genuinamente cada página. (Importante: el solo informe por sí solo no da protección a los visitantes; es solo el primer paso seguro.)

  2. Construye la política a partir de lo que tu web usa de verdad. Revisa los informes para encontrar cada fuente legítima de scripts, estilos, fuentes e imágenes —tu propio dominio, tus analíticas, tu proveedor de pagos, tu host de fuentes, tu widget de chat— y enuméralas como fuentes permitidas. Un buen punto de partida es default-src 'self' más entradas explícitas para los terceros de confianza que de verdad usas.

  3. Evita los agujeros que arruinan todo el propósito. Mantente alejado de 'unsafe-inline' y 'unsafe-eval' para scripts, y evita las fuentes con comodín como * y los esquemas pelados como https: para scripts: estos reabren el mismo hueco que la política debía cerrar. Donde los scripts en línea sean inevitables, usa un nonce o un hash para que solo se ejecute tu código aprobado concreto.

  4. Bloquea el enmarcado y los complementos. Añade frame-ancestors 'self' (esto también impide que otras webs incrusten la tuya para engañar a tus clientes, y satisface la comprobación relacionada de secuestro de clics) y object-src 'none' para bloquear los ataques basados en complementos heredados.

  5. Cambia de solo informe a imposición. Una vez que los informes estén limpios y la web funcione, cambia el nombre de la cabecera de Content-Security-Policy-Report-Only a Content-Security-Policy. Este es el paso que de verdad entrega protección: una política de solo informe por sí sola no lo hace, y no pasará la comprobación.

    Dónde configuras la cabecera depende de tu plataforma:

    • Cloudflare: Rules → Transform Rules → Modify Response Header → configura Content-Security-Policy. (También puedes usar Cloudflare para la prueba de solo informe.)
    • Nginx: add_header Content-Security-Policy "default-src 'self'; script-src 'self'; object-src 'none'; frame-ancestors 'self';" always;
    • Apache: Header always set Content-Security-Policy "default-src 'self'; script-src 'self'; object-src 'none'; frame-ancestors 'self';"
    • IIS (web.config): añade una cabecera de respuesta HTTP personalizada llamada Content-Security-Policy con la política como su valor.
    • Google Workspace / Microsoft 365: estos hacen funcionar tu correo, no tu web pública, así que la política se configura allá donde esté alojada de verdad tu web (Cloudflare o tu host web de arriba), no en el panel de administración de tu correo.
  6. Vuelve a comprobar tu dominio para confirmar que la política ahora aparece como activada y en imposición, sin agujeros que la debiliten.

Errores habituales

Preguntas frecuentes

No soy técnico, ¿puedo encargarme de esto yo mismo?

No necesitas entender los detalles. Esto es un ajuste añadido por quien lleve tu web o tu hosting, y en servicios como Cloudflare está en gran medida guiado. Pásales la sección «Cómo solucionarlo» de más abajo. Es gratis; la única precaución es que debe desplegarse con cuidado primero en una prueba de solo observación para que no bloquee por accidente partes de tu propia web, que es exactamente lo que cubren los pasos.

Ya tengo el candado y un certificado SSL, ¿no es segura mi web?

El candado asegura la entrega de tu página; no vigila lo que se ejecuta dentro de ella. Si código malicioso acaba alguna vez en una página —vía un complemento pirateado, un anuncio comprometido o un campo inyectado—, el candado no impedirá que robe datos. Una Política de Seguridad de Contenido es la capa que limita qué tiene permiso para ejecutarse en primer lugar. Protegen cosas distintas, y quieres ambas.

¿Activar esto podría romper mi web?

Puede, si se activa de forma agresiva de golpe, porque puede bloquear scripts legítimos que de verdad usas. Por eso el enfoque estándar es empezar en modo de prueba de «solo informe» que observa sin bloquear, arreglar lo que señale, y solo entonces imponerla. Hecho así es seguro, y el paso de prueba está integrado en la solución de abajo.

Ya la pusimos en modo «solo informe», ¿estamos cubiertos?

No, y esta es la falsa sensación de seguridad más común. El modo de solo informe observa y registra lo que se bloquearía, pero no bloquea nada: los visitantes obtienen cero protección real. Es solo el primer paso seguro. Nuestra comprobación da al solo informe una pequeña fracción del crédito de una política real y no lo registrará como aprobado. Solo estás protegido una vez que cambias a modo de imposición.

¿Esto afecta a nuestra puntuación, o es solo orientativo?

Afecta a tu puntuación. La comprobación de la Política de Seguridad de Contenido está calificada y vale hasta 25 puntos en la categoría de Seguridad Web. Una política ausente o débil se marca como severidad alta y arrastra tu calificación a la baja, y es exactamente el tipo de hueco que pregunta el cuestionario de seguridad de un cliente.

Nuestro desarrollador añadió una política pero la puntuación sigue baja, ¿por qué?

Una política puede existir y aun así ser débil. Los culpables más comunes son agujeros como «unsafe-inline» y «unsafe-eval» para scripts, o fuentes con comodín (un * pelado), que reabren el mismo hueco que la política debía cerrar. Nuestra comprobación lee la política directiva por directiva y puntúa a la baja esas debilidades: una política que permite cualquier cosa apenas puntúa mejor que no tener ninguna. La solución es endurecer las reglas de scripts usando nonces o hashes en lugar de esos agujeros.