Headers de seguridad y Content Security Policy
Baseline razonable
Sección titulada «Baseline razonable»Content-Security-Policy: default-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'none'; script-src 'self' 'nonce-...'; upgrade-insecure-requestsStrict-Transport-Security: max-age=31536000; includeSubDomainsX-Content-Type-Options: nosniffReferrer-Policy: strict-origin-when-cross-originPermissions-Policy: camera=(), microphone=(), geolocation=()Adapta las fuentes de imágenes, APIs, tipografías y scripts al proyecto. No copies una CSP con 'unsafe-inline' y docenas de dominios sin entenderla: puede dar sensación de seguridad sin bloquear el vector real.
Desplegar CSP
Sección titulada «Desplegar CSP»- Inventariar recursos y terceros.
- Empezar con
Content-Security-Policy-Report-Only. - Revisar reportes y eliminar dependencias inesperadas.
- Usar nonces por respuesta o hashes para scripts permitidos.
- Aplicar la política y monitorear violaciones.
CSP controla qué puede ejecutar/cargar el documento y mitiga XSS; el input todavía debe escapar o sanitizarse.
Matices
Sección titulada «Matices»- HSTS solo después de confirmar HTTPS en todos los subdominios incluidos.
frame-ancestorsen CSP reemplaza casos deX-Frame-Optionsy evita clickjacking.- CORS controla lectura entre orígenes; no autentica ni impide enviar requests.
- Headers deben probarse en respuestas de error, redirects y rutas dinámicas, no solo en
/.
CSP por etapas
Sección titulada «CSP por etapas»Empieza con una política mínima en una ruta representativa y usa Report-Only para conocer scripts, imágenes, fuentes, frames y conexiones reales. Corrige dependencias inesperadas antes de aplicar el bloqueo. Un nonce debe generarse por respuesta y llegar solo al script que autorizas; no reutilices un nonce fijo en el código fuente.
Content-Security-Policy-Report-Only: default-src 'self'; script-src 'self' 'nonce-{requestNonce}'; object-src 'none'; report-to csp-endpointEvita permitir *, data: o 'unsafe-inline' sin una razón concreta. Si un proveedor necesita scripts, restringe el origen y revisa qué otros dominios carga. La política de seguridad de contenido (CSP) reduce el impacto de una inyección, pero la defensa primaria sigue siendo escapar, validar y sanitizar según el contexto.
Cookies, CORS y framing
Sección titulada «Cookies, CORS y framing»Define explícitamente qué orígenes pueden leer una API y nunca reflejes cualquier Origin junto con credenciales. Configura Access-Control-Allow-Credentials solo cuando sea necesario y limita métodos y headers. Para una aplicación que no debe ser embebida, frame-ancestors 'none' protege mejor que confiar únicamente en una cabecera antigua.
Prueba headers en respuestas 200, 3xx, 4xx, archivos estáticos, rutas de autenticación y errores del proveedor. Un proxy o CDN puede reemplazarlos; verifica la respuesta pública, no solo la configuración de la aplicación.