22 nov 2025·8 min de lectura

Cabeceras seguras para aplicaciones web: CSP, HSTS, enmarcado y pruebas rápidas

Cabeceras seguras para apps web explicadas: qué hacen CSP, HSTS y las cabeceras de enmarcado, valores seguros para empezar y pruebas rápidas que evitan romper scripts.

Cabeceras seguras para aplicaciones web: CSP, HSTS, enmarcado y pruebas rápidas

Por qué importan las cabeceras de seguridad (y por qué a veces rompen apps)

La “endurecimiento del navegador” suele reducirse a unas pocas cabeceras de respuesta que le dicen al navegador que rechace comportamientos arriesgados. Tu app aún puede tener errores, pero el navegador recibe reglas más claras sobre qué puede cargar, dónde se le puede incrustar y si alguna vez puede volver a HTTP sin cifrar.

Por eso una app puede funcionar bien en desarrollo y luego fallar en una revisión de seguridad en producción. En desarrollo normalmente estás en localhost, tienes menos scripts de terceros y los valores por defecto son más permisivos. En producción añades dominios reales, CDNs, analítica, widgets de pago y SSO. Esos extras son justamente lo que las cabeceras de seguridad pueden bloquear si las aplicas de forma demasiado agresiva.

Cuando estas cabeceras están bien configuradas, reducen riesgos comunes como que un XSS convierta en toma de cuentas, clickjacking (tu app incrustada para engañar usuarios), ataques de degradación HTTPS y fugas de datos a dominios de terceros inesperados.

El problema: una sola cabecera “equivocada” puede romper flujos importantes. Una Content Security Policy estricta puede bloquear el script que renderiza tu botón de login, el iframe usado por un proveedor de pagos o una etiqueta de analítica que se carga después del consentimiento. HSTS también puede sorprender a los equipos. Si lo habilitas antes de que HTTPS esté completamente correcto, puedes forzar a los usuarios a HTTPS y hacer que el sitio parezca “caído” para ellos.

Un ejemplo realista: un prototipo generado por IA funciona en una URL de vista previa, pero en producción se añade un dominio personalizado y autenticación real. Entonces CSP bloquea el script de callback de auth, o las reglas de enmarcado bloquean el checkout embebido. FixMyMess ve esto a menudo; por eso las cabeceras deben desplegarse gradualmente, no activarse de golpe y olvidarse.

Las tres cabeceras a las que la gente suele referirse: CSP, HSTS y enmarcado

La mayoría de conversaciones sobre cabeceras de seguridad se reducen a tres controles que cubren tres riesgos:

  • Controlar qué puede ejecutar el navegador (CSP)
  • Controlar cómo se conecta el navegador (HSTS)
  • Controlar dónde se permiten que aparezcan tus páginas (X-Frame-Options o frame-ancestors de CSP)

1) CSP (Content-Security-Policy)

CSP le dice al navegador qué scripts, estilos, imágenes y conexiones están permitidos. Su tarea principal es limitar el daño de XSS bloqueando código inesperado.

También es la cabecera que más probabilidad tiene de romper cosas al principio, especialmente etiquetas de analítica, scripts inline y widgets de terceros.

2) HSTS (Strict-Transport-Security)

HSTS le dice al navegador que use siempre HTTPS para tu sitio durante un periodo de tiempo. Protege a los usuarios del SSL stripping y del acceso accidental por HTTP forzando conexiones cifradas.

Habilítala solo cuando tu app esté totalmente en HTTPS. Una vez que un navegador ha memorizado HSTS para tu dominio, no puedes deshacerlo rápidamente para ese usuario.

3) Protección de enmarcado (X-Frame-Options y frame-ancestors)

Las cabeceras de enmarcado controlan si otros sitios pueden embeber tus páginas en un iframe. Defienden contra el clickjacking evitando que una página maliciosa coloque tu interfaz bajo una capa falsa.

Verás dos opciones:

  • X-Frame-Options: más antiguo y simple (DENY o SAMEORIGIN)
  • frame-ancestors (dentro de CSP): más moderno, más flexible, suele ser preferible cuando ya usas CSP

Si tu app nunca debe ser embebida, por defecto “no permitir enmarcar” suele ser lo correcto. Si la incrustas intencionalmente (por ejemplo, dentro de un portal de socios), trátalo como una decisión de allowlist cuidadosa.

Fundamentos de CSP sin la jerga

CSP es la cabecera que le dice al navegador qué puede cargar y ejecutar la página. También es la que más probabilidad tiene de causar roturas repentinas, porque puede bloquear JavaScript que antes se ejecutaba sin restricciones.

Piensa en CSP como un portero. Los scripts, estilos, imágenes, fuentes y frames solo entran si coinciden con las reglas. Si tu app depende de un snippet inline, una etiqueta de analítica o un widget de terceros, CSP lo detendrá hasta que lo permitas explícitamente.

Dos directivas aparecen constantemente:

  • default-src es la regla por defecto. Si la configuras de forma estricta, todo lo que no esté cubierto por una regla más específica quedará bloqueado.
  • script-src controla de dónde pueden cargarse los scripts y qué tipo de ejecución se permite. Aquí es donde la rotura suele aparecer primero.

La mayoría de sorpresas vienen de los mismos patrones:

  • Scripts inline (código dentro del HTML) están bloqueados a menos que uses un nonce/hash o permitas 'unsafe-inline' (no es una buena solución a largo plazo).
  • eval() y rutas dinámicas similares están bloqueadas a menos que permitas 'unsafe-eval' (común en librerías antiguas y algunas herramientas).
  • Etiquetas de terceros (chat, analítica, tests A/B) cargan desde dominios que no permitiste, o inyectan código inline.

Un primer paso más seguro es usar Content-Security-Policy-Report-Only. El navegador reporta violaciones pero no las bloquea, así ves qué se rompería antes de que lo noten los usuarios.

Un ejemplo rápido: si un prototipo de Lovable o Replit “funciona” porque depende de scripts inline, Report-Only lo expondrá de inmediato. Los equipos suelen traer estos hallazgos a FixMyMess para reemplazar patrones riesgosos por scripts con nonces y eliminar usos ocultos de eval() sin cambiar la experiencia.

Configuraciones de CSP con las que puedes empezar (y luego endurecer)

CSP es una de las cabeceras más útiles, y una de las formas más fáciles de romper una UI si te pones demasiado estricto el primer día. Empieza con una política que bloquee lo peor y ve apretándola conforme aprendas qué carga realmente tu app.

Aquí tienes una CSP “inicial” razonable que suele funcionar para apps típicas (especialmente SPAs) y aporta protección:

Content-Security-Policy: default-src 'self'; base-uri 'self'; object-src 'none'; frame-ancestors 'none'; img-src 'self' data: https:; font-src 'self' https: data:; script-src 'self' 'unsafe-inline' 'unsafe-eval' https:; style-src 'self' 'unsafe-inline' https:; connect-src 'self' https:; upgrade-insecure-requests

Esto aún permite comportamientos arriesgados ('unsafe-inline' y 'unsafe-eval') para que tu app tenga menos probabilidades de caerse. La meta es eliminar esos permisos de forma segura, un cambio a la vez.

Endurecerla gradualmente

Haz un cambio, despliega y luego observa errores en la consola del navegador.

  • Bloquea scripts primero: reemplaza 'unsafe-inline' por nonces y elimina 'unsafe-eval' cuando puedas.
  • Reduce connect-src: deja solo las APIs y endpoints de terceros que realmente uses.
  • Limita img-src y font-src: mantén https: si usas CDNs; elimina data: si no lo necesitas.
  • Si debes embeber algo (pagos, docs), establece reglas de enmarcado intencionalmente en lugar de aflojar todo.

Nonces vs hashes (una regla simple)

Usa nonces cuando tus plantillas HTML generen scripts/styles inline en tiempo de ejecución (común en apps con renderizado en servidor). Usa hashes cuando el snippet inline sea estable y cambie raramente.

Para analítica, flujos de pago y widgets de soporte, espera añadir dominios específicos a script-src y connect-src. Si un prototipo generado por IA tiene scripts inline desordenados, puede que necesites un pequeño pase de limpieza primero (trabajo común de FixMyMess) antes de poder endurecer CSP sin sorpresas.

HSTS: proteger HTTPS sin dejarte fuera accidentalmente

HSTS le dice al navegador “usa siempre HTTPS para este sitio.” Después de que un navegador vea la cabecera una vez, reescribe visitas futuras a HTTPS incluso si alguien escribe http:// o hace clic en un enlace antiguo. Eso es genial para detener ataques de degradación, pero también puede forzarte a HTTPS si tu configuración no es estable.

Una vez que un navegador haya memorizado HSTS para tu dominio, no puedes revertirlo rápido para ese usuario. Si HTTPS falla mañana (certificado expirado, redirect malo, balanceador mal configurado), esos usuarios podrían no poder llegar al sitio hasta que lo soluciones.

Evita activar HSTS si cualquiera de estos puntos es cierto:

  • Tienes contenido mixto (imágenes, scripts o llamadas API por HTTP) que no has limpiado.
  • Los redireccionamientos son inconsistentes en las páginas.
  • Staging comparte el mismo dominio o subdominios que los usuarios pueden visitar en un navegador real.
  • Aún pruebas certificados, ajustes de CDN o dominios personalizados.

Un punto de partida seguro es un max-age pequeño (1 hora a 1 día). Tras algunos despliegues limpios, súbelo a una semana, luego a un mes y luego a 6–12 meses cuando estés seguro.

Ten cuidado con dos flags:

  • includeSubDomains significa que cada subdominio debe soportar HTTPS (admin, API, páginas de aterrizaje antiguas, subdominios olvidados).
  • preload es un compromiso aún mayor. Encaja con dominios maduros con HTTPS permanente, no con prototipos.

Si heredas una app construida por IA, verifica redirecciones y contenido mixto primero. Los equipos suelen pedir a FixMyMess una auditoría porque una cabecera mal aplicada en un prototipo inestable puede convertir un bug pequeño en una caída.

Protección de enmarcado: X-Frame-Options y frame-ancestors

Pasa la revisión de seguridad sin caídas
Apretaremos las cabeceras de forma segura sin tumbar checkout, SSO ni flujos clave.

El clickjacking ocurre cuando tu app se carga dentro de un frame oculto o engañoso en otro sitio. El usuario cree que está pulsando un botón inocuo, pero en realidad pulsa tu botón de “Eliminar cuenta” o “Transferir” que está debajo.

Para evitarlo usarás X-Frame-Options y/o CSP frame-ancestors. X-Frame-Options es más antiguo y limitado. Puede decir “deny” (nunca me enmarques) o “sameorigin” (solo enmarcarme desde el mismo sitio). frame-ancestors es la opción moderna porque soporta allowlists precisas.

Un valor por defecto seguro para la mayoría de apps es: no permitir enmarcado. Si tienes una razón real para embeber, mantén la permisividad muy estrecha.

Patrones prácticos:

  • Sin embeds: frame-ancestors 'none'
  • Solo tu sitio: frame-ancestors 'self'
  • Tu sitio más un host de confianza: frame-ancestors 'self' https://partner.example
  • Mantén X-Frame-Options como respaldo: DENY o SAMEORIGIN

Prueba rápida: intenta cargar una página sensible dentro de un iframe en un archivo HTML simple. Si sigue renderizando, la protección de enmarcado no funciona. Esto es común en prototipos generados por IA porque las plantillas suelen olvidar estas cabeceras o aplicarlas de forma inconsistente en las rutas.

Paso a paso: desplegar cabeceras con riesgo mínimo

La forma más segura de añadir cabeceras de seguridad es empezar con una base que cambie poco, probar que nada se rompe y luego endurecer una regla a la vez. Trátalo como un cambio de producto, no como un ajuste rápido de configuración.

1) Añade una base y luego aprieta

Un orden práctico:

  • Establece protección de enmarcado primero (menos probable que rompa scripts).
  • Añade HSTS con cuidado (solo cuando HTTPS esté sólido en todas partes).
  • Añade una CSP básica que permita los scripts actuales y luego elimina permisos inseguros gradualmente.
  • Re-prueba flujos críticos (login, checkout, uploads, embeds) tras cada cambio.
  • Registra cualquier excepción con una razón y un responsable.

2) Elige un solo lugar para fijar las cabeceras

Puedes fijar cabeceras en tu servidor de la app (Express, Rails, Django), en un reverse proxy (Nginx) o en la configuración de tu hosting/plataforma. Escoge una fuente de verdad. Si las cabeceras se definen en varios sitios, acabarás enviando valores conflictivos y perdiendo horas depurando lo que realmente recibe el navegador.

3) Despliega como una característica

Aplica cambios en staging primero, luego libéralos a una porción pequeña de tráfico (o un entorno limitado) antes del despliegue total. Mantén una opción de rollback rápida (un cambio de configuración, no un redeploy) para recuperar rápido si falla un script de terceros o un redirect de OAuth.

4) Documenta excepciones para que no se propaguen

Cuando debas permitir algo (un host de scripts, un snippet inline, un iframe), anota qué habilita, por qué es necesario y qué lo reemplazará más adelante. Si no, las excepciones “temporales” se vuelven permanentes.

Si heredaste un prototipo generado por IA, estas cabeceras suelen sacar a la luz problemas ocultos rápidamente. FixMyMess puede hacer una auditoría rápida y ayudarte a añadir cabeceras de forma segura sin romper comportamiento en producción.

Cómo probar rápido (y entender qué se rompió)

Cerrar enmarcado correctamente
Bloquea clickjacking con frame-ancestors y arregla los flujos embebidos que necesiten allowlists.

Las pruebas rápidas ganan a adivinar. Primero confirma que el navegador recibe las cabeceras. Luego mira qué bloqueó el navegador.

Revisa en DevTools primero

Abre tu sitio y DevTools:

  • Network: haz clic en la petición del documento principal y revisa Response Headers para ver CSP, HSTS y enmarcado.
  • Console: las violaciones de CSP aparecen con mensajes como “Refused to load...” junto con la URL bloqueada y la directiva (por ejemplo, script-src).
  • Security panel (en la mayoría de navegadores): confirma HTTPS y mira detalles del certificado.
  • Application panel: comprueba si HSTS está activo.

Cuando algo se rompe tras añadir CSP, el mensaje de la consola es tu mapa. Relaciona el elemento bloqueado con la directiva:

  • Script o código inline bloqueado -> script-src
  • Llamada a una API bloqueada -> connect-src
  • Imagen/fuente bloqueada -> img-src o font-src

Ejemplo: si el login deja de funcionar y la consola dice que una petición a https://api.yourapp.com fue bloqueada por connect-src, arréglalo permitiendo ese host en connect-src (no aflojando todo).

Comprobaciones rápidas por línea de comandos

Estos cheques confirman redirecciones, HTTPS y que las cabeceras las envía realmente tu servidor (no solo están configuradas en un sitio que tú estás saltando).

curl -I http://yourdomain.com
curl -I https://yourdomain.com
curl -I -L https://yourdomain.com

Mira:

  • Strict-Transport-Security sólo en respuestas HTTPS
  • que la respuesta final tras redirecciones (con -L) aún incluya tus cabeceras

Para confirmar que el enmarcado bloquea sin herramientas especiales, crea un HTML mínimo que haga un iframe de tu sitio y ábrelo localmente. Si queda en blanco o da error, tu política de enmarcado está funcionando.

Si necesitas ayuda interpretando logs de violaciones o arreglando un prototipo que se rompió tras endurecer cabeceras, FixMyMess puede auditar el código y aplicar correcciones seguras rápidamente.

Errores comunes que causan caídas o falsa confianza

La mayoría de problemas con cabeceras de seguridad no son “problemas de seguridad”; son problemas de despliegue. Un pequeño cambio puede bloquear scripts, romper logins o ocultar problemas reales tras un parche rápido.

Errores de CSP que rompen funciones reales

La forma más rápida de tumbar un frontend es imponer un CSP estricto antes de inventariar lo que la página realmente carga. Scripts inline, manejadores inline de eventos (como onclick), widgets de terceros e etiquetas de analítica inyectadas suelen existir incluso en apps “simples”.

Trampas comunes:

  • Imponer CSP estricta antes de inventariar scripts inline y fuentes de terceros
  • Usar 'unsafe-inline' y comodines amplios para “hacer que funcione” y luego no apretarlo nunca
  • Bloquear connect-src por accidente, de modo que las llamadas a APIs fallen y parezca que el backend está caído

Un patrón más seguro: empieza con reporting, arregla los mayores infractores y luego pasa a la imposición. Si vas a arreglar un prototipo, suele ser más rápido reemplazar scripts inline por archivos JS reales que seguir añadiendo excepciones.

Peligros de HSTS y enmarcado

HSTS es genial hasta que se aplica a un dominio que aún sirve HTTP en algún sitio (subdominios viejos, paneles admin olvidados, staging). Una vez que los navegadores guardan HSTS, “volver atrás” no ayuda rápido a los usuarios.

La protección de enmarcado también puede causar confusión. X-Frame-Options ayuda, pero el control moderno suele ser frame-ancestors en CSP. Si embebes tu app dentro de otro sitio (pagos, portales de socios, herramientas internas), una configuración estricta puede romper ese flujo.

Un motor más de caídas: confundir CORS con CSP. Los errores de CORS tratan sobre permitir lecturas cross-site; los errores de CSP tratan sobre qué la página puede cargar o ejecutar. Perseguir la equivocada lleva horas perdidas.

Si heredaste código generado por IA, estos problemas se acumulan rápido. FixMyMess ve equipos que “arreglan” síntomas deshabilitando protecciones en vez de quitar scripts inline, limpiar fuentes y mover secretos fuera del cliente. Eso da una casilla verde, pero no un endurecimiento real.

Lista de verificación rápida antes de lanzar

Antes de activar estas cabeceras en producción, haz una pasada rápida para evitar la trampa de “funcionó en una página”. Las cabeceras solo ayudan si son consistentes, y no deben sorprender a los usuarios con logins rotos, redirecciones atascadas o páginas en blanco.

  • Verifica varios tipos de respuesta: páginas normales, respuestas de API, redirecciones (301/302) y páginas de error (404/500). Confirma que las cabeceras aparecen en todas.
  • Carga tu app y confirma que no hay advertencias de contenido mixto (imágenes, scripts o fuentes HTTP en una página HTTPS).
  • Empieza CSP en Report-Only, arregla los items ruidosos y luego aplica enforcement.
  • Bloquea enmarcado por defecto y solo permite cuando tengas una razón clara.
  • Activa HSTS solo después de que HTTPS sea estable en todas partes, incluyendo subdominios que controlas y puntos de entrada comunes como páginas de marketing y callbacks.

Dos pruebas rápidas:

# Comprobar cabeceras en una página normal
curl -I https://yourdomain.com/

# Comprobar cabeceras también en un objetivo de redirección
curl -I -L https://yourdomain.com/login

En el navegador, abre la consola de DevTools y refresca. Si CSP es demasiado estricta, normalmente verás mensajes claros sobre qué fue bloqueado.

Un escollo común en el mundo real: la página de inicio tiene CSP, pero el redirect de login o el manejador 404/500 lo sirve otra capa (CDN, defecto del framework), así que las cabeceras desaparecen silenciosamente.

Si heredaste un prototipo generado por IA, estas inconsistencias son especialmente comunes. Una auditoría rápida de unas pocas rutas clave puede evitar un despliegue “seguro” que solo cubra el happy path.

Ejemplo: endurecer cabeceras en un prototipo sin romperlo

Eliminar unsafe-inline de la forma correcta
Sustituye fragmentos inline por código mantenible para poder eliminar permisos inseguros de CSP.

Heradas un prototipo generado por IA (por ejemplo de Bolt o Replit). Funciona en la demo, pero depende de scripts inline en el HTML, un widget de chat pegado en la página y un par de scripts de tracking añadidos a última hora.

Si aplicas un CSP estricto de inmediato, la app puede parecer “bien” hasta que intentes flujos reales. Roturas típicas: el redirect de login falla porque un script inline no se ejecutó, el widget de chat queda en blanco porque sus scripts y frames están bloqueados, y la analítica deja de enviar eventos justo cuando la necesitas.

Un plan de despliegue que evita la mayoría de sorpresas:

  • Empieza con Content-Security-Policy-Report-Only para que nada se bloquee aún.
  • Usa la consola y los reports de CSP para listar lo que la app realmente carga.
  • Reemplaza scripts inline por archivos externos donde puedas, o añade nonces para los que debas mantener.
  • Añade explícitamente los dominios del chat y la analítica (solo los que uses).
  • Aplica CSP solo después de que los principales recorridos de usuario (login, checkout, settings) estén limpios.

Después de eso, tu conjunto de cabeceras puede mantenerse simple a alto nivel:

  • CSP: bloquear por defecto, luego permitir tus propios scripts más una allowlist corta para proveedores necesarios; usa nonces para cualquier código inline restante.
  • HSTS: habilitar con un max-age razonable tras confirmar que HTTPS es estable en todas partes.
  • Enmarcado: bloquear embedding (o permitir solo tu propio origen) usando frame-ancestors.

Siguientes pasos: mantenerlo seguro a medida que la app cambia

Las cabeceras de seguridad no se “ponen y se olvidan”. Cada nueva ruta, etiqueta de terceros, widget de chat, script de pago o cambio de CDN puede cambiar lo que el navegador necesita permitir.

Mantén una breve nota de “política de cabeceras” junto a tus notas de despliegue: qué debe permitir tu CSP (scripts, estilos, frames), si HSTS está activo y si tu app debe ser enmarcada alguna vez (normalmente no). Suena simple, pero evita ediciones de pánico cuando algo se rompe.

Revisa tus cabeceras cada vez que añadas scripts de terceros y considera una comprobación mensual rápida. La mayoría de roturas vienen de “solo un snippet”.

Si tu app fue generada por herramientas como Lovable, Bolt, v0, Cursor o Replit, espera scripts inline ocultos y patrones inseguros. Eso suele empujar a equipos hacia ajustes riesgosos de CSP como permitir scripts inline. Trata esa presión como un olor a código: arregla el código para poder apretar la política.

Si quieres una segunda opinión, FixMyMess (fixmymess.ai) ofrece una auditoría de código gratuita para apps generadas por IA. Es una forma rápida de sacar a la luz los problemas de cabeceras que romperán producción y luego arreglar el código subyacente (auth, secretos, scripts desordenados) para que las configuraciones de seguridad se puedan imponer sin riesgos.

Preguntas Frecuentes

¿Qué cabecera de seguridad debo añadir primero si no quiero romper mi app?

Empieza con CSP en Report-Only, luego añade protección de enmarcado y, por último, HSTS. CSP es la que más suele romper scripts y flujos de autenticación, así que primero quieres visibilidad antes de imponer reglas.

¿Por qué dejó de funcionar mi login o checkout justo después de habilitar CSP?

Un CSP estricto suele bloquear scripts inline, etiquetas de terceros o widgets de auth/pago que cargan desde dominios que no permitiste. Lo habitual es leer la violación en la consola y permitir el host específico en la directiva correcta (a menudo script-src o connect-src) en lugar de aflojar todo.

¿Cuál es la forma más segura de desplegar un nuevo CSP?

Usa Content-Security-Policy-Report-Only primero. Te muestra lo que se bloquearía sin bloquear nada realmente, así puedes recopilar violaciones y actualizar la política con seguridad antes de aplicarla.

¿Debo usar nonces o hashes para CSP, y cuándo?

Evita 'unsafe-inline' como configuración a largo plazo. Prefiere nonces para scripts inline que se generan en cada petición, o hashes para fragmentos inline pequeños y estables, de modo que puedas mantener CSP estricto sin romper la interfaz.

¿Cómo activo HSTS sin dejar a los usuarios fuera si algo falla?

Empieza con un max-age pequeño (como una hora o un día) y ve aumentándolo tras varios despliegues limpios. Habilita HSTS solo cuando redirecciones, certificados y contenido mixto sean estables, porque los navegadores cachean HSTS y no puedes revertirlo rápidamente para los usuarios.

¿Qué riesgo tiene usar HSTS con includeSubDomains o preload?

includeSubDomains obliga HTTPS en todas las subdominios, incluidos paneles viejos o hosts olvidados. preload es un compromiso mayor; mejor reservarlo para dominios maduros donde HTTPS será permanente.

¿Debo bloquear iframes con X-Frame-Options o con frame-ancestors de CSP?

Por defecto, bloquea el enmarcado salvo que tengas un caso claro de embed. Usa frame-ancestors dentro de CSP para control moderno, y mantén X-Frame-Options: DENY o SAMEORIGIN como respaldo para clientes antiguos si quieres.

¿Cómo puedo confirmar rápidamente que mis cabeceras se están enviando y aplicando?

Abre DevTools y revisa la pestaña Network para las cabeceras de respuesta, y la Console para errores de CSP tipo “Refused to load…” que nombran la URL y la directiva bloqueada. También usa curl -I (y curl -I -L) para confirmar que la respuesta final tras redirecciones sigue incluyendo tus cabeceras.

¿Cómo diferencio un problema de CSP de uno de CORS?

CSP controla qué puede cargar y ejecutar la página (scripts, conexiones, frames). CORS controla si un sitio puede leer respuestas de otro sitio. Confundirlos lleva a aplicar la solución equivocada y perder tiempo.

¿Por qué los prototipos generados por IA se rompen más al añadir cabeceras de seguridad y qué debo hacer?

Los prototipos generados por IA suelen apoyarse en scripts inline, rutas eval() ocultas y snippets de terceros pegados que funcionan en la vista previa pero fallan en dominios reales y con cabeceras estrictas. Si necesitas ayuda para endurecer sin romper producción, FixMyMess puede hacer una auditoría de código gratuita y corregir el código subyacente para que CSP, HSTS y reglas de enmarcado se puedan imponer con seguridad.