Explica cómo diseñar una Content Security Policy con nonces, hashes, report-only y headers complementarios sin romper streaming, caché ni terceros.
Última actualización
Actualizada
Nivel
Profundización
Content Security Policy limita qué recursos puede ejecutar o cargar el navegador. Es una mitigación fuerte contra XSS y supply-chain abuse, pero no sanitiza datos ni corrige autorización. En Next.js, una política estricta debe convivir con scripts del framework, streaming, estilos, imágenes, fuentes y terceros sin recurrir a unsafe-inline como solución permanente.
Solo scripts con el mismo nonce pueden ejecutarse.
En Next.js, Proxy puede generar nonce y CSP, añadirlo como request header y el framework puede aplicarlo a scripts propios bajo la integración documentada.
Un nonce por request hace que HTML varíe y normalmente impide una shell completamente estática/CDN-cacheada. Puede afectar Cache Components y rendimiento.
Alternativas:
Hashes para scripts inline estáticos.
SRI/experimental integrity cuando la versión lo soporte.
Eliminar inline scripts.
Política menos dinámica pero todavía restrictiva.
Elige seguridad y caching según amenaza, no escondas el trade-off.
Autoriza contenido exacto. Funciona bien para un script inline estable; cualquier cambio exige recalcular hash. No sirve para contenido generado por request.
Con nonce/hash confiable, permite que un script autorizado cargue dependencias y puede ignorar allowlists heredadas en navegadores modernos. Mejora mantenimiento, pero entiende compatibilidad y evita autorizar un loader de terceros demasiado poderoso.
COOP/COEP/CORP permiten capacidades como SharedArrayBuffer, pero pueden romper embeds, imágenes o recursos sin headers compatibles. Actívalos por requisito, no como checklist.
Si CSP/HTML depende de un nonce, cada response cambia. Evita cachear HTML personalizado bajo una key compartida. Assets con hash siguen siendo públicos/inmutables.
No incluyas nonce como dimensión de caché que cree entradas infinitas; el documento dinámico debe tratarse bajo su semántica.
default-src 'self'
script-src 'self' nonce
style-src 'self'
img-src 'self' data: CDN allowlist
font-src 'self'
connect-src 'self' analytics after consent
frame-src video providers only on project routes
frame-ancestors 'none'
Un embed de video puede cargar solo al interactuar. No amplíes toda la política por un proveedor usado en una página si puedes usar una frontera/plataforma separada, aunque CSP suele ser por documento completo.