¿Las cookies HTTP son específicas del puerto?

355

Tengo dos servicios HTTP ejecutándose en una máquina. Solo quiero saber si comparten sus cookies o si el navegador distingue entre los dos sockets del servidor.

guerda
fuente

Respuestas:

329

La especificación actual de cookies es RFC 6265 , que reemplaza RFC 2109 y RFC 2965 (ambos RFC ahora están marcados como "Históricos") y formaliza la sintaxis para el uso de cookies en el mundo real. Establece claramente:

  1. Introducción

...

Por razones históricas, las cookies contienen una serie de infelicidades de seguridad y privacidad. Por ejemplo, un servidor puede indicar que una cookie determinada está destinada a conexiones "seguras", pero el atributo Seguro no proporciona integridad en presencia de un atacante de red activo. Del mismo modo, las cookies para un host determinado se comparten en todos los puertos de ese host, aunque la "política del mismo origen" habitual utilizada por los navegadores web aísla el contenido recuperado a través de diferentes puertos.

Y también:

8.5. Confidencialidad débil

Las cookies no proporcionan aislamiento por puerto . Si un servicio que se ejecuta en un puerto puede leer una cookie, un servicio que se ejecuta en otro puerto del mismo servidor también puede leer la cookie. Si un servicio puede escribir una cookie en un puerto, un servicio que se ejecuta en otro puerto del mismo servidor también puede escribir la cookie. Por esta razón, los servidores NO DEBEN ejecutar servicios de desconfianza mutua en diferentes puertos del mismo host y utilizar cookies para almacenar información confidencial de seguridad.

Remy Lebeau
fuente
129

De acuerdo con RFC2965 3.3.1 (que podría ser seguido o no por los navegadores), a menos que el puerto se especifique explícitamente a través del portparámetro del Set-Cookieencabezado, las cookies pueden o no enviarse a cualquier puerto.

El Manual de seguridad del navegador de Google dice: de forma predeterminada, el alcance de las cookies está limitado a todas las URL en el nombre de host actual, y no está vinculado a la información del puerto o protocolo. y algunas líneas más adelante. No hay forma de limitar las cookies a un solo nombre DNS [...] de la misma manera, no hay forma de limitarlas a un puerto específico. (Además, tenga en cuenta, que el IE hace números de puerto no tener en cuenta en su política del mismo origen en absoluto .)

Por lo tanto, no parece seguro confiar en un comportamiento bien definido aquí.

Tgr
fuente
75
RFC 6265 , que reemplaza a RFC 2965, elimina el Portparámetro en el Set-Cookieencabezado (porque casi nadie lo usó en la práctica), y hace muy explícito que las cookies en el mismo host ya NO son distinguibles por los puertos.
Remy Lebeau
55
IE 9 ni siquiera enviará la cookie en solicitudes posteriores si el dominio tiene un puerto
axk
3
¿Hay algún navegador que todavía esté considerando el puerto en el SOP de sus cookies?
Bertuz
55
Chrome ni siquiera configurará la cookie si tiene el dominio tiene un puerto.
Pim Heijden
76

Esta es una pregunta muy antigua, pero pensé que agregaría una solución alternativa que utilicé.

Tengo dos servicios ejecutándose en mi computadora portátil (uno en el puerto 3000 y el otro en 4000). Cuando saltaría entre ( http://localhost:3000yhttp://localhost:4000 ), Chrome pasaría la misma cookie, cada servicio no entendería la cookie y generaría una nueva.

Descubrí que si accedía http://localhost:3000yhttp://127.0.0.1:4000 el problema desaparecía, ya que Chrome mantenía una cookie para localhost y otra para 127.0.0.1.

Nuevamente, a nadie le puede importar en este punto, pero fue fácil y útil para mi situación.

Palmadita
fuente
1
Sí, debido a que las cookies están asociadas con los nombres de host / dominio, por lo que una cookie localhostno se puede compartir con 127.0.0.1y viceversa. Pero las cookies en el mismo host / dominio, independientemente del puerto, son compartibles.
Remy Lebeau
3
Por supuesto que lo hacen. Yo (y probablemente otros millones de desarrolladores) utilizo localhost para probar todo el tiempo. A menos que el puerto agregado marque la diferencia: localhost: 8080
David Balažic
53
Además, puede usar 127.0.0.1, 127.0.0.2, 127.0.0.3, etc., todos ellos significan localhost.
David Balažic
3
No puedo votar esto porque no responde la pregunta, pero es un gran consejo, ¡gracias!
Martin T.
2
Si está dispuesto a editar su archivo de hosts (/ etc / hosts en Unix), puede tener tantos nombres significativos como desee para localhost.
Silas S. Brown
20

Esta es un área gris grande en SOP de cookies (Política del mismo origen).

Teóricamente, puede especificar el número de puerto en el dominio y la cookie no se compartirá. En la práctica, esto no funciona con varios navegadores y se encontrará con otros problemas. Por lo tanto, esto solo es factible si sus sitios no son para el público en general y usted puede controlar qué navegadores usar.

El mejor enfoque es obtener 2 nombres de dominio para la misma IP y no depender de los números de puerto para las cookies.

Codificador ZZ
fuente
99
Ya no es un área gris. RFC 6265 , que es el estándar de cookies actual, elimina cualquier confusión al respecto simplemente eliminando la capacidad de separar las cookies en el mismo host utilizando diferentes puertos.
Remy Lebeau
18

Una forma alternativa de solucionar el problema es hacer que el nombre de la cookie de sesión esté relacionado con el puerto. Por ejemplo:

  • mysession8080 para el servidor que se ejecuta en el puerto 8080
  • mysession8000 para el servidor que se ejecuta en el puerto 8000

Su código podría acceder a la configuración del servidor web para averiguar qué puerto usa su servidor y nombrar la cookie en consecuencia.

Tenga en cuenta que su aplicación recibirá ambas cookies, y debe solicitar la que corresponda a su puerto.

No es necesario tener el número de puerto exacto en el nombre de la cookie, pero esto es más conveniente.

En general, el nombre de la cookie podría codificar cualquier otro parámetro específico de la instancia del servidor que utilice, por lo que puede decodificarse según el contexto correcto.

Manolis M. Tsangaris
fuente
9

En IE 8, las cookies (verificadas solo con localhost) se comparten entre los puertos. En FF 10, no lo son.

He publicado esta respuesta para que los lectores tengan al menos una opción concreta para probar cada escenario.

Jeb
fuente
4

Estaba experimentando un problema similar al ejecutar (e intentar depurar) dos aplicaciones de Django diferentes en la misma máquina.

Los estaba ejecutando con estos comandos:

./manage.py runserver 8000
./manage.py runserver 8001

Cuando inicié sesión en el primero y luego en el segundo, siempre cerré sesión en el primero y viceversa.

Agregué esto en mi / etc / hosts

127.0.0.1    app1
127.0.0.1    app2

Luego comencé las dos aplicaciones con estos comandos:

./manage.py runserver app1:8000
./manage.py runserver app2:8001

Problema resuelto :)

Andrea Grandi
fuente
44
probablemente pueda usarlo 127.0.0.1:8000por uno, localhost:8000por un segundo y posiblemente ::1:8000(tal vez [::1]:8080) por un tercero sin tener que tocar el archivo de hosts.
Travis Watson
1
puedes ponerlo en una línea:::1 app1 app2 app3 app4 app5 appN
aeroson