¿El puerto de cookies HTTP es específico?


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

Author: Matthew Murdoch, 2009-10-23

8 answers

La especificación de cookies actual es RFC 6265, que reemplaza a RFC 2109 y RFC 2965 (ambas RFC ahora están marcadas como "Históricas") y formaliza la sintaxis para los usos del mundo real de las cookies. Dice 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 " seguridad" conexiones, pero el atributo Secure no proporciona integridad en presencia de un atacante de red activo. Del mismo modo, las cookies para un host dado se comparten en todos los puertos de ese host, a pesar de que 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. Escasa confidencialidad

Las cookies no proporcionan aislamiento por puerto. Si una cookie es legible por un servicio que se ejecuta en un puerto, la cookie también es legible por un servicio que se ejecuta en otro puerto del mismo servidor. Si una cookie es editable por un servicio en un puerto, la cookie también es editable por un servicio que se ejecuta en otro puerto del mismo servidor. Por esta razón, los servidores NO deben ejecutar servicios que desconfíen mutuamente en diferentes puertos del mismo host y usar cookies para almacenar información confidencial de seguridad.

 239
Author: Remy Lebeau,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-02 00:24:04

De acuerdo con RFC2965 3.3.1 (que puede o no ser seguido por los navegadores), a menos que el puerto se especifique explícitamente a través del parámetro port del encabezado Set-Cookie, las cookies pueden o no ser enviadas 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 del nombre de host actual, y no está vinculado a la información de puerto o protocolo. y algunas líneas posteriores No hay forma de limitar las cookies a un solo DNS solo nombre [...] del mismo modo, no hay manera de limitarlos a un puerto específico. (También, tenga en cuenta, que IE no factoriza los números de puerto en su política del mismo origen en absoluto.)

Así que no parece seguro confiar en ningún comportamiento bien definido aquí.

 117
Author: Tgr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-25 15:22:49

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

Tengo dos servicios que se ejecutan en mi computadora portátil (uno en el puerto 3000 y el otro en 4000). Cuando saltaba entre (http://localhost:3000 y http://localhost:4000), Chrome pasaba la misma cookie, cada servicio no entendía la cookie y generaba una nueva.

Encontré que si accedía a http://localhost:3000 y http://127.0.0.1:4000, el problema desapareció ya que Chrome mantuvo una cookie para localhost y una para 127.0.0.1.

De nuevo, nadie puede importarle en este punto, pero fue fácil y útil para mi situación.

 50
Author: Pat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-11 03:07:51

Esta es una gran área gris en el 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 puede controlar qué navegadores usar.

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

 18
Author: ZZ Coder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-10-23 14:15:46

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 utiliza su servidor y nombrar la cookie en consecuencia.

Tenga en cuenta que su aplicación recibirá tanto cookies, como necesita solicitar el que corresponde 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 de servidor que utilice, por lo que puede ser decodificado por el contexto correcto.

 16
Author: Manolis M. Tsangaris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-20 11:22:58

En IE 8, las cookies (verificadas solo contra localhost) se comparten entre 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.

 9
Author: Jeb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-02-16 15:51:27

Estaba experimentando un problema similar al ejecutar (e intentar depurar) dos aplicaciones 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.

He añadido esto en mi /etc/hosts

127.0.0.1    app1
127.0.0.1    app2

Luego inicié las dos aplicaciones con estos comandos:

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

Problema resuelto:)

 2
Author: Andrea Grandi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-21 10:32:47

Es opcional.

Se puede especificar el puerto para que las cookies puedan ser específicas del puerto. No es necesario, el servidor web / aplicación debe cuidar de esto.

Fuente: Artículo de Wikipedia en alemán, RFC2109 , Capítulo 4.3.1

 1
Author: guerda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-10-23 10:29:29