Utilia

Generador de Content Security Policy (CSP)

Crea la cabecera Content-Security-Policy, la etiqueta meta y la versión Report-Only con plantillas, nonces y hashes SHA-256, y audita tu política.

Empezar desde una plantilla

Los hosts de Google son ejemplos tomados de la guía CSP de Google para la etiqueta de Google. Google los cambia de vez en cuando: consulta la documentación actual y elimina lo que no uses.

Directivas

Orígenes separados por espacios. Deja un campo vacío para omitir la directiva (las directivas de carga recurren entonces a default-src).

Añadir rápido

Un nonce debe ser un valor aleatorio nuevo en cada respuesta, generado por tu servidor y repetido en cada <script nonce="…">. Un nonce fijo no protege nada.

Calcular el hash de un script o estilo en línea

El hash cubre el texto exacto entre las etiquetas, incluidos espacios y saltos de línea: cualquier cambio exige un hash nuevo. Los manejadores de eventos en línea (onclick=…) necesitan además 'unsafe-hashes'.

Informes de infracciones

Añade report-uri (navegadores antiguos) y report-to con una cabecera Reporting-Endpoints.

En una etiqueta <meta>, los navegadores ignoran frame-ancestors, report-uri, report-to y sandbox, y Report-Only no está admitido. Coloca la etiqueta al principio de <head>: solo se aplica al contenido que viene después.

Revisión de esta política

Evaluar una política existente

Cómo crear una política

  1. Elige un punto de partida en Empezar desde una plantilla: Estricta (nonce + strict-dynamic), Sitio estático blindado, Sitio web típico o Típico + Google Analytics / Ads. El editor se abre con la plantilla de sitio web típico.
  2. Ajusta las Directivas. Cada campo admite orígenes separados por espacios; si dejas un campo vacío, la directiva no se incluye.
  3. Usa Añadir rápido para agregar una palabra clave a la Directiva elegida: 'self', 'none', 'unsafe-inline', 'strict-dynamic', https:, data:… Añadir un nonce inserta un nonce aleatorio de 128 bits.
  4. Para permitir un script en línea concreto sin recurrir a 'unsafe-inline', pégalo (o el HTML que lo rodea) en Calcular el hash de un script o estilo en línea y pulsa Calcular SHA-256 y añadir.
  5. Marca upgrade-insecure-requests si alguna URL antigua sigue usando http:// y, si quieres, indica una URL del endpoint de informes.
  6. Copia la Cabecera HTTP, la Cabecera Report-Only o la Etiqueta HTML . La Revisión de esta política se actualiza mientras escribes.

Para auditar una política que ya tienes, pégala en Evaluar una política existente y pulsa Evaluar la política; Cargar en el editor la copia en los campos para que puedas retocarla.

Para qué sirve una Content Security Policy

Una CSP le indica al navegador desde qué orígenes puede cargar una página scripts, estilos, imágenes, fuentes, iframes y conexiones. Su función principal es limitar el cross-site scripting (XSS): aunque un atacante consiga inyectar marcado en tu página, una buena política impide que el script inyectado se ejecute. También controla quién puede incrustar tu página en un iframe (frame-ancestors), adónde pueden enviarse los formularios (form-action) y a qué puede apuntar <base> (base-uri).

Las directivas de carga como img-src o font-src recurren a default-src cuando faltan. En cambio, base-uri, form-action y frame-ancestors no tienen ese respaldo, y por eso la revisión las pide de forma explícita.

Nonces, hashes y strict-dynamic

Permitir hosts (script-src https://cdn.example.com) parece seguro, pero a menudo se puede eludir: los grandes dominios alojan endpoints JSONP y bibliotecas antiguas que un atacante puede reutilizar. El enfoque que recomiendan los equipos de seguridad de los navegadores es una CSP estricta: cada <script> legítimo lleva un nonce que el servidor genera en cada respuesta, o se autoriza mediante su hash, y 'strict-dynamic' permite que esos scripts de confianza carguen los scripts que necesitan. Con ese planteamiento, https: y 'unsafe-inline' solo sirven de respaldo para navegadores muy antiguos; los modernos los ignoran.

Un nonce solo funciona si cambia en cada respuesta y es impredecible. El que inserta Añadir un nonce es un ejemplo: tu servidor o tu framework debe generar el suyo. Un hash cubre los bytes exactos del código en línea, así que si vuelves a formatear el script necesitarás un hash nuevo.

Cabecera, Report-Only y etiqueta meta

Siempre que puedas, envía la política como cabecera de respuesta HTTP. Despliégala primero como Content-Security-Policy-Report-Only: los navegadores informan de las infracciones (en la consola y en tu endpoint si has definido uno) sin bloquear nada, de modo que puedes corregir tus páginas antes de aplicarla de verdad. Los ajustes de informes añaden report-uri para navegadores antiguos y report-to con una cabecera Reporting-Endpoints.

La versión <meta http-equiv> resulta práctica en alojamientos estáticos, pero los navegadores ignoran en ella frame-ancestors, report-uri, report-to y sandbox, y no existe una etiqueta meta Report-Only. La herramienta quita esas directivas de la etiqueta y te lo indica.

Todo se genera en tu navegador: la política que escribes o pegas no se envía a ningún servidor.

Preguntas frecuentes

¿Es un problema 'unsafe-inline' en style-src?

Es menos peligroso que en script-src y muy habitual, porque muchas bibliotecas aplican estilos en línea. Aun así, el CSS inyectado puede desfigurar una página o filtrar datos, por eso la revisión lo marca con gravedad baja.

¿Están completos los hosts de Google Analytics?

Son ejemplos de la guía CSP de Google para la etiqueta de Google. Google los ajusta con el tiempo y pueden hacer falta dominios regionales; consulta la documentación actual de Google y elimina lo que no uses. El fragmento en línea de gtag.js también necesita un nonce o un hash.

¿Por qué mi política bloquea mis propios scripts en línea?

En cuanto defines script-src sin 'unsafe-inline', se bloquean todos los <script> en línea y los atributos onclick=. Mueve el código a un archivo o añade un nonce o un hash.

¿Una CSP sustituye al escapado de los datos del usuario?

No. Una CSP es una segunda línea de defensa. Sigue escapando la salida y validando la entrada; la política limita los daños cuando algo se cuela.

¿Puedo tener varias políticas?

Sí: si una página recibe varias cabeceras CSP, cada recurso debe cumplirlas todas. Pega las políticas de una en una en el evaluador.