Condividi i cookie tra sottodominio e dominio


422

Ho due domande Comprendo che se specifica il dominio come .mydomain.com(con il punto iniziale) nel cookie, tutti i sottodomini possono condividere un cookie.

È possibile subdomain.mydomain.comaccedere a un cookie creato in mydomain.com(senza il wwwsottodominio)?

Può mydomain.com(senza il wwwsottodominio) accedere al cookie se creato in subdomain.mydomain.com?


3
Sì, puoi .. per favore vedi il link qui sotto codeguru.com/csharp/csharp/cs_internet/article.php/c19417/…
Rahul Jain,


Potete per favore un'occhiata a questa domanda stackoverflow.com/questions/38351769/...
Jayavardhan Gange

1
@ adam0101 Cosa succede se il dominio e il sottodominio sono ospitati su server diversi?
user3782114

3
@utente3782114, non importa se si trovano su server diversi. Nel mio caso, non si trovavano solo su server diversi, ma ogni dominio era bilanciato in base al carico su più server. Una cosa che ci ha fatto inciampare un po 'è stato che anche gli ambienti inferiori (dev, test, uat, ecc.) Hanno iniziato a condividere lo stesso cookie una volta che lo abbiamo fatto perché li avevamo chiamati come "dev.oursite.com", "test. oursite.com ", ecc. Il trucco (almeno in .Net) è quello di avere una chiave macchina separata generata per ciascun ambiente e salvarla nel tuo Web.config (supponendo che tu trasformi la configurazione per ogni ambiente).
adam0101,

Risposte:


655

I 2 domini mydomain.come subdomain.mydomain.compossono condividere i cookie solo se il dominio è esplicitamente indicato Set-Cookienell'intestazione. In caso contrario, l'ambito del cookie è limitato all'host della richiesta. (Questo è indicato come "cookie solo host". Vedere Cos'è un cookie solo host? )

Ad esempio, se hai inviato la seguente intestazione da subdomain.mydomain.com, il cookie non verrà inviato per le richieste a mydomain.com:

Set-Cookie: name=value

Tuttavia, se si utilizza quanto segue, sarà utilizzabile su entrambi i domini:

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

Questo cookie verrà inviato per qualsiasi sottodominio di mydomain.com, inclusi sottodomini nidificati come subsub.subdomain.mydomain.com.

In RFC 2109 , un dominio senza punto iniziale significava che non poteva essere utilizzato su sottodomini e solo un punto iniziale ( .mydomain.com) gli avrebbe consentito di essere utilizzato su più sottodomini (ma non il dominio di livello superiore, quindi quello che chiedevi era non possibile nelle specifiche precedenti).

Tuttavia, tutti i browser moderni rispettano le più recenti specifiche RFC 6265 e ignoreranno qualsiasi punto iniziale, il che significa che è possibile utilizzare il cookie sui sottodomini e sul dominio di primo livello.

In sintesi, se si imposta un cookie come il secondo esempio sopra da mydomain.com, sarebbe accessibile da subdomain.mydomain.come viceversa. Questo può anche essere usato per consentire sub1.mydomain.come sub2.mydomain.comcondividere i cookie.

Guarda anche:


3
Grazie; Ho aggiunto una nota sul significato del punto.
cmbuckley,

2
Non capisco perché non si debba solo mettere il "" leader. sul dominio per la massima compatibilità con vecchi e nuovi
Alan Macdonald il

12
Nel vecchio standard, un cookie con domain=.mydomain.comnon è valido per mydomain.com nudo, quindi i due RFC non sono compatibili tra loro.
cmbuckley,

4
@Frank, si lo so. Il mio commento è stato quello di chiarire che la mia domanda riguardava la condivisione dei cookie tra un dominio e un sottodominio, NON tra due sottodomini.
adam0101,

3
Non sono sicuro di dove metterlo, quindi scelgo i commenti della risposta accettata. Ci sono voluti molto tempo e gli esperimenti falliti per dimostrare quanto sopra sul mio localhost, fino a quando mi è venuto in mente che avrei dovuto chiamare il localhost con un punto nel nome. Come "localhost.com" o qualcosa del genere. Quindi tutti i comportamenti "impostati cookie" sono iniziati seguendo le spiegazioni scritte qui in questa risposta. Sperando che questo possa aiutare qualcuno.
Cesc

32

Non sono sicuro che la risposta di @cmbuckley mostri il quadro completo. Quello che ho letto è:

Salvo diversamente indicato dagli attributi del cookie, il cookie viene restituito solo al server di origine (e non, ad esempio, a eventuali sottodomini) e scade al termine della sessione corrente (come definito dall'agente utente). I programmi utente ignorano i cookie non riconosciuti.

RFC 6265

Anche

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.

Per me ciò significa che puoi proteggere i cookie dalla lettura da sottodominio / dominio ma non puoi impedire la scrittura di cookie negli altri domini. Quindi qualcuno potrebbe riscrivere i cookie del tuo sito controllando un altro sottodominio visitato dallo stesso browser. Quale potrebbe non essere una grande preoccupazione.

Fantastico sito di test sui cookie fornito da @cmbuckley / per coloro che lo hanno perso nella sua risposta come me; vale la pena scorrere su e upvoting /:


4
Ciò sembra concordare con quello che sto dicendo: a meno che non si specifichi un domain, il cookie viene utilizzato solo per l'host della richiesta. Ciò significa che Set-Cookie: name=valueda mydomain.comnon verrà inviato con richieste ai sottodomini. Gioca anche con questo script di prova .
cmbuckley,

@cmbuckley, ok, quello che hai detto sembra corretto. Riscriverò la mia risposta. Grazie per averlo sottolineato.
Akostadinov,

È necessario sottolineare che la sezione 4.1.2 (prima citazione) non è normativa ...
Velda,

grazie per il link cmbuckley. bello testare come funziona velocemente.
legislatore

22

Ecco un esempio usando l'API per i cookie DOM ( https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie ), in modo da poter vedere di persona il comportamento.

Se eseguiamo il seguente JavaScript:

document.cookie = "chiave = valore"

Sembra essere lo stesso dell'esecuzione:

document.cookie = "chiave = valore; dominio = miodominio.com"

La chiave cookie diventa disponibile (solo) sul dominio mydomain.com .


Ora, se esegui il seguente JavaScript su mydomain.com:

document.cookie = "chiave = valore; dominio = .miodominio.com"

La chiave cookie diventa disponibile per mydomain.com e subdomain.mydomain.com .


Infine, se dovessi provare ad eseguire quanto segue su subdomain.mydomain.com:

document.cookie = "chiave = valore; dominio = .miodominio.com"

La chiave cookie diventa disponibile per subdomain.mydomain.com ? Sono stato un po 'sorpreso che questo sia permesso; Avevo supposto che sarebbe stata una violazione della sicurezza per un sottodominio poter impostare un cookie su un dominio padre.


1
Questo mi chiedo se ci sono specifiche separate che descrivono il comportamento dei httponlycookie rispetto al tipo di cookie che stai creando.
adam0101,

3
I documenti che hai pubblicato non sono d'accordo con le dichiarazioni che fai. I primi 2 esempi non sono equivalenti (un domainattributo fa sì che il cookie funzioni sui sottodomini; nessun attributo del genere non lo fa). I punti iniziali vengono ignorati nella migliore delle ipotesi e bloccati attivamente nella peggiore.
cmbuckley,

questa è la soluzione migliore se non vuoi fare affidamento sulle intestazioni host. Ho controllato e funzionava
Szymon il

14

Tutti notano che è possibile impostare un cookie da un sottodominio su un dominio.

(inviato nella risposta per la richiesta subdomain.mydomain.com)

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

Ma NON PUOI impostare un cookie da un dominio su un sottodominio.

(inviato nella risposta per la richiesta mydomain.com)

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

PERCHÉ ?

Secondo le specifiche RFC 6265 sezione 5.3.6 Modello di archiviazione

Se l'host della richiesta canonicalized non corrisponde al dominio dell'attributo domain: ignora completamente il cookie e interrompi questi passaggi.

e RFC 6265 sezione 5.1.3 Corrispondenza dominio

Abbinamento dominio

Una stringa di dominio corrisponde a una determinata stringa di dominio se almeno una delle seguenti condizioni è valida:

  1. La stringa di dominio e la stringa sono identiche. (Si noti che sia la stringa di dominio che la stringa saranno state canonicalizzate in minuscolo a questo punto.)

  2. Sono valide tutte le seguenti condizioni:

    • La stringa di dominio è un suffisso della stringa.

    • L'ultimo carattere della stringa che non è incluso nella stringa di dominio è un carattere% x2E (".").

    • La stringa è un nome host (ovvero non un indirizzo IP).

Quindi "subdomain.mydomain.com" corrisponde al dominio "mydomain.com", ma "mydomain.com" NON corrisponde al dominio "subdomain.mydomain.com"

Controlla anche questa risposta .


Questa è stata la risposta più utile per me.
Toby,

3

In entrambi i casi sì, è possibile e questo è il comportamento predefinito sia per IE che per Edge.

Le altre risposte aggiungono preziose informazioni, ma descrivono principalmente il comportamento in Chrome. è importante notare che il comportamento è completamente diverso in IE. Lo script di test molto utile di CMBuckley dimostra che in (diciamo) Chrome, i cookie non sono condivisi tra root e sottodomini quando non viene specificato alcun dominio. Tuttavia, lo stesso test in IE mostra che sono condivisi. Questo caso IE è più vicino alla descrizione da portare a casa nel link www-or-not-www di CMBuckley. So che questo è il caso perché abbiamo un sistema che utilizza diversi cookie di service pack sia sul root che sul sottodominio. Tutto ha funzionato bene fino a quando qualcuno non vi ha effettuato l'accesso in IE e i due sistemi hanno combattuto contro il cui cookie di sessione avrebbe vinto fino a quando non abbiamo fatto saltare la cache.


0

Fai attenzione se stai lavorando su localhost! Se memorizzi i tuoi cookie in js in questo modo:

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

Potrebbe non essere accessibile al tuo sottodominio, ad esempio sub.localhost. Per risolvere questo problema devi usare Virtual Host . Ad esempio, puoi configurare il tuo host virtuale con, ServerName localhost.comquindi sarai in grado di memorizzare i tuoi cookie sul tuo dominio e sottodominio in questo modo:

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

-12

Soluzione semplice

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

Il quinto parametro di Setcookie determina i (sotto) domini per i quali è disponibile il cookie. Impostandolo su (EXAMPLE.COM) lo rende disponibile per qualsiasi sottodominio (es: SUBDOMAIN.EXAMPLE.COM)

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


18
Questa domanda non è specifica per PHP, non penso che sia valida.
sergelerator

1
Sergelerator, non ho posto una domanda. Stavo rispondendo al PO.
Lawes,

4
@Lawes Credo che sergelator significhi che la domanda del PO non è specifica per PHP mentre la tua risposta sembra essere una soluzione solo per PHP, quindi non si qualificherebbe per la domanda del PO.
Mirage,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.