2009-10-23 13 views

Respuesta

206

La especificación de cookie actual es RFC 6265, que reemplaza RFC 2109 y RFC 2965 (ambas RFC ahora están marcadas como "Históricas") y formaliza la sintaxis para el uso de cookies en el mundo real. Se establece claramente:

  1. Introducción

...

Por razones históricas, las galletas contienen una serie de infortunios seguridad y privacidad. Por ejemplo, un servidor puede indicar que una cookie determinada está destinada a conexiones "seguras", pero el atributo de seguridad 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 habitual de "mismo origen" 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 el 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 un servicio puede escribir una cookie en un puerto, un servicio que se ejecuta en otro puerto del mismo servidor también puede escribir en la cookie. Por este motivo, los servidores NO DEBEN ejecutar servicios mutuamente desconfiados en diferentes puertos del mismo host y usar cookies para almacenar información sensible a la seguridad.

1

Es opcional.

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

Fuente: German Wikipedia article, RFC2109, Capítulo 4.3.1

+2

[suena como si más complicado que esto en la vida real.] (http://stackoverflow.com/questions/1612177/are-http-cookies-port-specific/4212964#4212964) – bzlm

18

Ésta es un área gris grande en la cookie de SOP (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.

+7

No es un gris área más. [RFC 6265] (http://tools.ietf.org/html/rfc6265), que es el estándar de cookies actual, elimina cualquier confusión al eliminar simplemente la capacidad de separar las cookies en el mismo host utilizando diferentes puertos. –

112

Según RFC2965 3.3.1 (que podría o no podría ser seguido por los navegadores), a menos que el puerto se especifica explícitamente a través del parámetro port de la cabecera Set-Cookie, galletas puede o no ser enviados a cualquier puerto.

de Google Browser Security Handbook dice: por defecto, el alcance de la galleta se limita a todas las direcciones URL en el nombre de host actual - y no unida a la información de puerto o protocolo. y algunas líneas más adelante No hay forma de limitar las cookies a un solo nombre DNS [...] solo de la misma manera, no hay forma de limitarlas a un puerto específico. (Además, tenga en cuenta, que el IE no tiene en cuenta los números de puerto en su política de mismo origen en absoluto.)

Por lo tanto, no parece ser seguro que confiar en cualquier comportamiento bien definido aquí.

+51

[RFC 6265] (http://tools.ietf.org/html/rfc6265), que reemplaza RFC 2965, elimina el parámetro 'Port' en el encabezado' Set-Cookie' (porque casi nadie lo usó en la práctica) , y hace que sea muy explícito que las cookies en el mismo host NO SON ya distinguibles por los puertos. –

+4

IE 9 ni siquiera enviará la cookie a solicitudes posteriores si el dominio tiene un puerto – axk

+2

¿Hay algún navegador que todavía esté considerando el puerto en el SOP de sus cookies? – Bertuz

14

Una forma alternativa de evitar 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 tener acceso a la configuración del servidor web para averiguar qué puerto su servidor usa y nombra la cookie en consecuencia.

Tenga en cuenta que su aplicación recibirá ambas cookies y deberá solicitar la que corresponde a su puerto.

No es necesario tener el número de puerto exacto en el nombre de la cookie, pero 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 mediante el contexto correcto.

9

En IE 8, las cookies (verificadas solo contra el host local) 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.

42

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

Tengo dos servicios ejecutándose 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.

Descubrí que si accedía a http://localhost:3000 y http://127.0.0.1:4000, el problema desaparecía porque Chrome guardaba 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.

+0

Sí, porque las cookies están asociadas a nombres de host/dominio, por lo que una cookie en 'localhost' no puede compartirse con' 127.0.0.1' y viceversa. Pero las cookies en el mismo host/dominio, independientemente del puerto, se pueden compartir. –

+0

Esto probablemente solo funciona en Chrome, ya que la mayoría de los otros navegadores no envían cookies a "localhost" (= una cadena sin dos puntos) – Max

+3

Por supuesto que sí. Yo (y probablemente millones de otros desarrolladores) utilizo localhost para realizar pruebas todo el tiempo. A menos que el puerto agregado marque la diferencia: http: // localhost: 8080/ –

2

Estaba teniendo un problema similar al ejecutar (y tratar de depurar) dos aplicaciones diferentes de Django en la misma máquina.

les estaba corriendo con estos comandos:

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

Cuando hice de inicio de sesión en el primero y luego en la segunda Siempre me desconecté el primero y viceversa.

he añadido esto en mis /etc/hosts

127.0.0.1 app1 
127.0.0.1 app2 

Entonces empecé a las dos aplicaciones con estos comandos:

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

problema resuelto :)

+3

probablemente puedas usar '127.0.0.1: 8000' para uno,' localhost: 8000' por un segundo, y posiblemente ':: 1: 8000' (tal vez' [:: 1]: 8080') para un tercero sin tener que tocar el archivo de hosts. – Travis

+0

puedes ponerlo en una línea: '' ':: 1 app1 app2 app3 app4 app5 appN''' – aeroson

Cuestiones relacionadas