Compartir cookie entre subdominio y dominio

423

Tengo dos preguntas. Entiendo que si especifico el dominio como .mydomain.com(con el punto inicial) en la cookie, todos los subdominios pueden compartir una cookie.

¿Se puede subdomain.mydomain.comacceder a una cookie creada en mydomain.com(sin el wwwsubdominio)?

¿Puede mydomain.com(sin el wwwsubdominio) acceder a la cookie si se crea en subdomain.mydomain.com?

adam0101
fuente
3
Sí, puedes ... mira el enlace a continuación codeguru.com/csharp/csharp/cs_internet/article.php/c19417/…
Rahul Jain
Muy relacionado: stackoverflow.com/questions/3089199/…
Ciro Santilli ill 郝海东 病 六四 事件 法轮功
¿Puedes mirar esta pregunta? stackoverflow.com/questions/38351769/…
Jayavardhan Gange
1
@ adam0101 ¿Qué sucede si el dominio y el subdominio están alojados en un servidor diferente?
user3782114
3
@ user3782114, no importa si están en servidores diferentes. En mi caso, no solo estaban en servidores diferentes, sino que cada dominio tenía equilibrio de carga en varios servidores. Una cosa que nos hizo tropezar un poco fue que los entornos inferiores (dev, test, uat, etc.) también comenzaron a compartir la misma cookie una vez que lo hicimos porque los habíamos llamado "dev.oursite.com", "test". oursite.com ", etc. El truco allí (al menos en .Net) es tener una clave de máquina separada generada para cada entorno y guardarla en su Web.config (suponiendo que transforme la configuración para cada entorno).
adam0101

Respuestas:

656

Los dominios 2 mydomain.comy subdomain.mydomain.comsólo pueden compartir las cookies si el dominio es nombrado explícitamente en la Set-Cookiecabecera. De lo contrario, el alcance de la cookie está restringido al host de la solicitud. (Esto se conoce como "cookie de solo host". Consulte ¿Qué es una cookie de solo host? )

Por ejemplo, si envió el siguiente encabezado desde subdomain.mydomain.com, entonces la cookie no se enviará para solicitudes a mydomain.com:

Set-Cookie: name=value

Sin embargo, si usa lo siguiente, será utilizable en ambos dominios:

Set-Cookie: name=value; domain=mydomain.com

Esta cookie se enviará para cualquier subdominio de midominio.com, incluidos los subdominios anidados como subsub.subdomain.mydomain.com.

En RFC 2109 , un dominio sin un punto inicial significaba que no podía usarse en subdominios, y solo un punto inicial ( .mydomain.com) permitiría que se usara en múltiples subdominios (pero no en el dominio de nivel superior, así que lo que usted preguntó fue no es posible en la especificación anterior).

Sin embargo, todos los navegadores modernos respetan la especificación más reciente RFC 6265 e ignorarán cualquier punto inicial, lo que significa que puede usar la cookie en subdominios y en el dominio de nivel superior.

En resumen, si configura una cookie como el segundo ejemplo anterior mydomain.com, sería accesible por subdomain.mydomain.com, y viceversa. Esto también se puede utilizar para permitir sub1.mydomain.comy sub2.mydomain.comcompartir cookies.

Ver también:

cmbuckley
fuente
3
Gracias; Agregué una nota sobre el significado del punto.
cmbuckley
2
No entiendo por qué no pondrías el "". en el dominio para una máxima compatibilidad con lo antiguo y lo nuevo
Alan Macdonald
12
En el antiguo estándar, una cookie con domain=.mydomain.comno es válida para mydomain.com, por lo que los dos RFC no son compatibles entre sí.
cmbuckley
44
@ Frank, sí, lo sé. Mi comentario fue aclarar que mi pregunta era sobre compartir cookies entre un dominio y un subdominio, NO entre dos subdominios.
adam0101
3
No estoy seguro de dónde poner esto, así que elijo los comentarios de la respuesta aceptada. Me llevó mucho tiempo y fallé los experimentos para probar lo anterior en mi localhost, hasta que se me ocurrió que debería llamar al localhost con un punto en el nombre. Como "localhost.com" o algo así. Luego, todos los comportamientos de "establecer cookies" comenzaron siguiendo las explicaciones escritas aquí en esta respuesta. Esperando que esto pueda ayudar a alguien.
Cesc
32

No estoy seguro de que la respuesta de @cmbuckley muestre la imagen completa. Lo que leo es:

A menos que los atributos de la cookie indiquen lo contrario, la cookie se devuelve solo al servidor de origen (y no, por ejemplo, a ningún subdominio), y caduca al final de la sesión actual (según lo definido por el agente de usuario). Los agentes de usuario ignoran las cookies no reconocidas.

RFC 6265

también

8.6.  Weak Integrity

   Cookies do not provide integrity guarantees for sibling domains (and
   their subdomains).  For example, consider foo.example.com and
   bar.example.com.  The foo.example.com server can set a cookie with a
   Domain attribute of "example.com" (possibly overwriting an existing
   "example.com" cookie set by bar.example.com), and the user agent will
   include that cookie in HTTP requests to bar.example.com.  In the
   worst case, bar.example.com will be unable to distinguish this cookie
   from a cookie it set itself.  The foo.example.com server might be
   able to leverage this ability to mount an attack against
   bar.example.com.

Para mí, eso significa que puede proteger las cookies de ser leídas por subdominio / dominio, pero no puede evitar escribir cookies en los otros dominios. Entonces, alguien puede reescribir las cookies de su sitio controlando otro subdominio visitado por el mismo navegador. Lo que podría no ser una gran preocupación.

Impresionante sitio de prueba de cookies provisto por @cmbuckley / para aquellos que lo perdieron en su respuesta como yo; vale la pena desplazarse hacia arriba y votar arriba:

akostadinov
fuente
44
Parece estar de acuerdo con lo que estoy diciendo: a menos que especifiques una domain, la cookie solo se usa para el host de solicitud. Esto significa que Set-Cookie: name=valuedesde mydomain.comno se enviará con solicitudes a subdominios. Juega también con este script de prueba .
cmbuckley
@cmbuckley, ok, lo que dijiste parece correcto. Reformularé mi respuesta. Gracias por señalar eso.
akostadinov
Es necesario señalar que la sección 4.1.2 (primera cita) no es normativa ...
Velda
gracias por el enlace cmbuckley. Es bueno probar cómo funciona rápidamente.
Lawphotog
22

Aquí hay un ejemplo usando la API de cookies DOM ( https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie ), para que podamos ver por nosotros mismos el comportamiento.

Si ejecutamos el siguiente JavaScript:

document.cookie = "clave = valor"

Parece ser lo mismo que ejecutar:

document.cookie = "clave = valor; dominio = midominio.com"

La clave de cookie está disponible (solo) en el dominio midominio.com .


Ahora, si ejecuta el siguiente JavaScript en mydomain.com:

document.cookie = "clave = valor; dominio = .midominio.com"

La clave de cookie está disponible para midominio.com así como para subdominio.midominio.com .


Finalmente, si intentara ejecutar lo siguiente en subdominio.midominio.com:

document.cookie = "clave = valor; dominio = .midominio.com"

¿La clave de cookie está disponible para subdominio.midominio.com ? Me sorprendió un poco que esto esté permitido; Asumí que sería una violación de seguridad para un subdominio poder establecer una cookie en un dominio principal.

llambda
fuente
1
Esto me hace preguntarme si hay especificaciones separadas que describan el comportamiento de las httponlycookies en comparación con el tipo de cookies que está creando.
adam0101
3
Los documentos que publicó no están de acuerdo con las declaraciones que hace. Los primeros 2 ejemplos no son equivalentes (un domainatributo hace que la cookie funcione en subdominios; no existe dicho atributo). Los puntos principales se ignoran en el mejor de los casos y se bloquean activamente en el peor.
cmbuckley
Esta es la mejor solución si no desea confiar en los encabezados de host. Lo revisé y está funcionando
Szymon
14

Tenga en cuenta que puede configurar una cookie de un subdominio en un dominio.

(enviado en la respuesta para solicitar subdomain.mydomain.com)

Set-Cookie: name=value; Domain=mydomain.com // GOOD

Pero NO PUEDE configurar una cookie de un dominio en un subdominio.

(enviado en la respuesta para solicitar mydomain.com)

Set-Cookie: name=value; Domain=subdomain.mydomain.com // Browser rejects cookie

POR QUÉ ?

De acuerdo con las especificaciones RFC 6265 sección 5.3.6 Modelo de almacenamiento

Si el host de solicitud canonicalizado no coincide con el atributo de dominio: ignore la cookie por completo y anule estos pasos.

y RFC 6265 sección 5.1.3 Coincidencia de dominio

Dominio coincidente

Una cadena de dominio coincide con una cadena de dominio dada si se cumple al menos una de las siguientes condiciones:

  1. La cadena de dominio y la cadena son idénticas. (Tenga en cuenta que tanto la cadena de dominio como la cadena se habrán canonicalizado en minúsculas en este punto).

  2. Se cumplen todas las siguientes condiciones:

    • La cadena de dominio es un sufijo de la cadena.

    • El último carácter de la cadena que no se incluye en la cadena de dominio es un carácter% x2E (".").

    • La cadena es un nombre de host (es decir, no una dirección IP).

Entonces, "subdominio.midominio.com" coincide con el dominio "midominio.com", pero "midominio.com" NO coincide con el dominio "subdominio.midominio.com"

Comprueba esta respuesta también.

Contador م
fuente
Esta fue la respuesta más útil para mí.
Toby
3

En ambos casos, sí puede, y este es el comportamiento predeterminado tanto para IE como para Edge.

Las otras respuestas agregan información valiosa, pero describen principalmente el comportamiento en Chrome. Es importante tener en cuenta que el comportamiento es completamente diferente en IE. El script de prueba muy útil de CMBuckley demuestra que en (por ejemplo) Chrome, las cookies no se comparten entre la raíz y los subdominios cuando no se especifica ningún dominio. Sin embargo, la misma prueba en IE muestra que se comparten. Este caso de IE está más cerca de la descripción para llevar a casa en el enlace www-or-not-www de CMBuckley. Sé que este es el caso porque tenemos un sistema que utilizaba diferentes cookies de pila de servicios tanto en la raíz como en el subdominio. Todo funcionó bien hasta que alguien accedió a él en IE y los dos sistemas discutieron sobre la cookie de sesión que ganaría hasta que explotáramos el caché.

DannyW
fuente
0

¡Ten cuidado si estás trabajando en localhost! Si almacena su cookie en js así:

document.cookie = "key=value;domain=localhost"

Puede que no sea accesible a su subdominio, como sub.localhost. Para resolver este problema, debe usar Virtual Host . Por ejemplo, puede configurar su host virtual con el ServerName localhost.comque podrá almacenar su cookie en su dominio y subdominio de esta manera:

document.cookie = "key=value;domain=localhost.com"
Alexandre97122
fuente
-12

Solución simple

setcookie("NAME", "VALUE", time()+3600, '/', EXAMPLE.COM);

El quinto parámetro de Setcookie determina los (sub) dominios para los que está disponible la cookie. Establecerlo en (EJEMPLO.COM) lo pone a disposición de cualquier subdominio (por ejemplo: SUBDOMAIN.EXAMPLE.COM)

Referencia: http://php.net/manual/en/function.setcookie.php

Leyes
fuente
18
Esta pregunta no es específica de PHP, no creo que califique como válida.
sergelerator
1
Sergelerator, no hice una pregunta. Estaba respondiendo al OP.
Lawes
44
@Lawes Creo que sergelator significa que la pregunta del OP no es específica de PHP, mientras que su respuesta parece ser una solución solo de PHP, por lo tanto, no calificaría para la pregunta del OP.
Mirage