🔒 Registro cerrado · Apertura oficial próximamente · Acceso exclusivo para alumnos activos
Iniciar SesiónOrigen cruzado: qué permite una política CORS laxa
5 tareas · 40 min · Principiante
El navegador separa los sitios por origen: esquema, nombre y puerto. Una página de un origen no puede leer lo que responde otro, salvo que el servidor lo autorice con las cabeceras de CORS. Esta sala lee las variaciones de la cabecera Origin que el evaluador repitió con la cuenta de prueba A en la API de Boletería Jerusalén, que vende boletas para conciertos y teatro, y separa la política abierta que no importa de la que entrega datos de la cuenta a cualquier sitio. Nadie envía nada: se lee lo que quedó registrado.
Objetivo de la sala
El navegador separa los sitios por origen: esquema, nombre y puerto. Una página de un origen no puede leer lo que responde otro, salvo que el servidor lo autorice con las cabeceras de CORS. Esta sala lee las variaciones de la cabecera Origin que el evaluador repitió con la cuenta de prueba A en la API de Boletería Jerusalén, que vende boletas para conciertos y teatro, y separa la política abierta que no importa de la que entrega datos de la cuenta a cualquier sitio. Nadie envía nada: se lee lo que quedó registrado.Dos URL tienen el mismo origen si coinciden en esquema, nombre de host y puerto. https://www.boletas-jerusalen.example y https://api.boletas-jerusalen.example son orígenes distintos aunque pertenezcan a la misma empresa. Por defecto, el código de una página puede enviar peticiones a otro origen, pero el navegador no le entrega la respuesta: la política del mismo origen protege la lectura.
CORS es la forma en que un servidor relaja esa regla. Cuando la petición viene de otro origen, el navegador manda la cabecera Origin y mira la respuesta: si Access-Control-Allow-Origin nombra ese origen (o es *), deja que el código lea el cuerpo. Para algunas peticiones (métodos distintos de GET, HEAD y POST simples, o cabeceras propias) el navegador pregunta antes con una petición previa OPTIONS.
Lo importante para el informe: CORS no impide que la petición llegue al servidor. Decide si el código de otro sitio puede leer lo que vuelve. Por eso no sustituye la protección contra las peticiones forzadas entre sitios (CSRF): una petición simple, de las que no llevan consulta previa, se ejecuta en el servidor aunque la política no deje leer su respuesta.
Responde para continuar
Una API responde sin ninguna cabecera de CORS a una petición que llega desde otro origen. ¿Qué pasa?
Ver pista de ayuda
CORS habla de lo que el navegador entrega al código de la página, no de lo que el servidor recibe.
Con cookies de por medio entran dos cabeceras. La petición tiene que ir con credenciales y la respuesta tiene que traer Access-Control-Allow-Credentials: true. Además, el estándar de Fetch no acepta el comodín en ese caso: si la petición lleva credenciales y la respuesta dice Access-Control-Allow-Origin: *, el navegador no entrega el cuerpo. Por eso un * en una API pública casi nunca es hallazgo: sirve para datos que cualquiera puede ver.
El fallo típico es otro. Para «soportar varios dominios» el servidor copia en Access-Control-Allow-Origin lo que llegue en Origin y añade las credenciales. El resultado es que cualquier sitio que visite una persona con la sesión abierta puede leer, con la cookie de esa persona, lo que la API le devuelve a ella. Falta una condición para que eso ocurra: que la cookie de sesión viaje en una petición entre sitios, cosa que solo hace si está marcada SameSite=None.
Abre el laboratorio, lee cors-pruebas.txt y después cookies.txt.
Responde para continuar
Escribe la ruta del endpoint de la API que devuelve como permitido el origen de prueba del evaluador junto con las credenciales.
Ver pista de ayuda
Compara, petición por petición, el Origin enviado con el Access-Control-Allow-Origin recibido; mira solo las que vienen de un origen que no es de Jerusalén.
Hay contextos en los que el navegador manda Origin: null: documentos abiertos desde un archivo local, ciertas redirecciones y los marcos con atributo de aislamiento. Algunos equipos ponen null en su lista de permitidos «para que funcione el entorno local». El problema es que cualquiera puede fabricar un contexto que envíe ese valor, así que permitir null con credenciales equivale, en la práctica, a permitir a todo el mundo.
En la misma exportación hay un endpoint que rechaza el origen del evaluador pero acepta el nulo. Fíjate en qué devuelve.
Responde para continuar
Escribe la ruta del endpoint que acepta el origen nulo con credenciales.
Ver pista de ayuda
Busca la palabra null en cors-pruebas.txt y comprueba que la respuesta trae también la cabecera de credenciales.
La API de socios también refleja el origen y también dice true en las credenciales. Antes de copiar el mismo hallazgo, mira cómo se autentica. El navegador adjunta solo las cookies; una cabecera Authorization con un token la tiene que poner el propio código de la página, y el código de otro sitio no conoce ese token.
Responde para continuar
¿Cómo valoras la respuesta de la API de socios (P-06)?
Ver pista de ayuda
Pregúntate qué credencial adjuntaría el navegador por su cuenta si la petición la lanzara otro sitio.
P-07 muestra una tercera forma de fallar: la regla acepta cualquier origen que empiece por el nombre del sitio, y https://www.boletas-jerusalen.example.origen-evaluador.example es un dominio del evaluador, no de Jerusalén. Las comprobaciones con «empieza por», «termina en» o «contiene» se saltan registrando un nombre que cumpla el patrón. La corrección se escribe para los tres casos a la vez.
Responde para continuar
¿Qué corrección recomiendas para P-03, P-05 y P-07?
Ver pista de ayuda
Una de las opciones el navegador la rechazaría; otra sigue aceptando dominios ajenos que cumplan el patrón.
Whoami-Labs Pro
Whoami-Labs Pro utiliza cookies
Utilizamos cookies y almacenamiento local para el funcionamiento del sitio, seguridad de sesión y, si lo autorizas, analítica y marketing. Puedes aceptar, rechazar o personalizar. Política de Privacidad
Preferencias
Configuraciones de cookies
Elige qué categorías permitir. Las esenciales siempre están activas. Consulta la Política de Privacidad.
Esenciales
Siempre activas · sesión, CSRF, tema y esta preferencia
Necesarias para iniciar sesión, proteger formularios (CSRF) y recordar tu elección de cookies y tema. Sin ellas la plataforma no funciona de forma segura.
Analíticos
Hoy no activos en la plataforma; listos para cuando se conecten
Nos ayudan a entender uso de cursos y páginas. Si los activas, se usarán cuando conectemos analítica; hasta entonces no se carga ningún tracker.
Marketing
Hoy no activos; campañas futuras solo con tu permiso
Comunicaciones o campañas. No activos hoy en la plataforma; quedarán listos si los conectamos y solo si los permites.