Inicio›Biblioteca›Ejemplos de Content-Security-Policy

Ejemplos de Content-Security-Policy

Valores de la cabecera Content-Security-Policy listos para copiar y usar en configuraciones habituales: una base estricta, Google Fonts, analítica, videos de YouTube incrustados, scripts con nonce y protección contra clickjacking. Haz clic en una tarjeta para copiar la política y úsala como valor de la cabecera Content-Security-Policy (cada ejemplo indica qué permite). La franja de cada tarjeta muestra un bloque por directiva; los bloques de color ámbar contienen una fuente unsafe-* que conviene revisar.

Base estricta (solo el mismo origen)
default-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'self'
Origen propio + imágenes de cualquier origen (https)
default-src 'self'; img-src 'self' data: https:; object-src 'none'; base-uri 'self'
SPA que consulta una API en un único origen
default-src 'self'; connect-src 'self' https://api.example.com; img-src 'self' data:; object-src 'none'
Google Fonts
default-src 'self'; style-src 'self' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com; object-src 'none'
Google Analytics 4
default-src 'self'; script-src 'self' https://www.googletagmanager.com; connect-src 'self' https://*.google-analytics.com https://*.analytics.google.com; img-src 'self' https://*.google-analytics.com; object-src 'none'
Videos de YouTube incrustados
default-src 'self'; frame-src https://www.youtube-nocookie.com https://www.youtube.com; img-src 'self' https://i.ytimg.com; object-src 'none'
Scripts con nonce + strict-dynamic
script-src 'nonce-{RANDOM}' 'strict-dynamic'; object-src 'none'; base-uri 'none'
Práctica: permite estilos en línea
default-src 'self'; style-src 'self' 'unsafe-inline'; object-src 'none'; base-uri 'self'
Pasar los subrecursos de http a https
default-src 'self'; upgrade-insecure-requests
Clickjacking desactivado (sin inserción en marcos)
frame-ancestors 'none'
Configuración inicial con Report-Only
default-src 'self'; report-uri /csp-report; report-to csp-endpoint

Preguntas frecuentes

¿Dónde configuro una CSP?
Preferiblemente como cabecera de respuesta HTTP: Content-Security-Policy: <value> en la configuración de tu servidor, CDN o alojamiento. La etiqueta <meta http-equiv="Content-Security-Policy"> también admite la mayoría de las directivas, pero frame-ancestors, report-uri y report-to solo funcionan en cabeceras, así que las recetas que las usan deben configurarse como cabeceras.
¿Cómo la implemento sin romper mi sitio?
Empieza con la cabecera Content-Security-Policy-Report-Only (la receta Report-Only de esta página): el navegador informa de las infracciones sin bloquear nada. Revisa los informes durante una semana, añade las fuentes que tu sitio realmente necesita y luego usa el mismo valor en la cabecera que aplica los bloqueos.
¿Qué significa el marcador nonce-{RANDOM}?
Sustituye {RANDOM} por un nuevo valor base64 generado para cada respuesta y añade ese mismo valor a cada etiqueta script como nonce="…". Junto con strict-dynamic, esto permite únicamente los scripts que has incluido (y lo que estos cargan) y bloquea cualquier código inyectado, lo que ofrece más protección que mantener una lista de hosts permitidos.
¿Por qué aparece 'unsafe-inline' en ámbar?
Permitir código en línea es la principal brecha que aprovechan los ataques XSS: una etiqueta <script> o un atributo style inyectados se ejecutan como si fueran tuyos. La receta style-src 'unsafe-inline' existe porque muchos frameworks siguen inyectando estilos en línea, pero úsala como solución provisional: para los scripts, es preferible usar nonces o hashes. Por eso ninguna receta de esta página incluye script-src 'unsafe-inline'.