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-requestsClickjacking 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-endpointPreguntas 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'.