Todas las guías
Severidad AltaErrores de configuración

CORS mal configurado: las trampas del comodín y del reflejo

Cross-Origin Resource Sharing (CORS) controla qué otros sitios web pueden leer las respuestas de tu API. Una política con comodín o con origen reflejado puede permitir que cualquier sitio haga solicitudes autenticadas y lea los resultados.

Qué es

Los navegadores bloquean las lecturas entre orígenes por defecto. Los encabezados CORS relajan eso de forma selectiva. Access-Control-Allow-Origin: * abre las respuestas a todos los sitios web.

Un bug más sutil es el reflejo de origen: el servidor devuelve en el encabezado allow-origin cualquier Origin que traiga la solicitud, lo que en la práctica confía en todos mientras parece específico.

Por qué importa

Si tu API sirve datos de usuarios y permite credenciales, una política CORS demasiado amplia deja que un sitio malicioso lea los datos de una víctima con sesión iniciada directamente desde tu API.

El reflejo combinado con Access-Control-Allow-Credentials: true es especialmente peligroso: anula la protección de mismo origen que normalmente mantiene privados los datos de los usuarios.

Cómo solucionarlo

Usa una lista de orígenes permitidos

Valida el Origin de la solicitud contra una lista fija de dominios de confianza y solo entonces devuélvelo.

const ALLOWED = new Set(["https://app.yourdomain.com"]);
const origin = req.headers.get("origin") ?? "";
const allow = ALLOWED.has(origin) ? origin : "";
// only set the header when allow is non-empty
Nunca combines el comodín con credenciales

Los navegadores prohíben Access-Control-Allow-Origin: * junto con credenciales, así que algunas apps reflejan el origen en su lugar — y esa es la vulnerabilidad. Usa una lista estricta de permitidos.

Por defecto, sin CORS

Si un endpoint no necesita acceso entre orígenes, no envíes ningún encabezado CORS. Abre solo las rutas específicas que realmente lo requieran.

Preguntas frecuentes

¿Access-Control-Allow-Origin: * es siempre malo?

No para recursos genuinamente públicos y sin credenciales (p. ej. una fuente pública o una API de datos abiertos). Es peligroso para cualquier cosa ligada a una sesión de usuario.

¿CORS protege mi servidor?

No: CORS lo aplica el navegador, no el servidor. Gobierna lo que el JavaScript de otros sitios puede leer, no si una solicitud llega hasta ti.

¿Tu app está afectada?

AppSafe verifica este y docenas de problemas más en un solo escaneo gratis.

Escanear mi app gratis