Come funzionano i domini dei cookie del browser?


380

A causa di strani problemi relativi ai cookie di dominio / sottodominio che sto riscontrando, vorrei sapere come i browser gestiscono i cookie. Se lo fanno in modi diversi, sarebbe anche bello conoscere le differenze.

In altre parole, quando un browser riceve un cookie, quel cookie può avere un dominio e un percorso ad esso collegati. O no, nel qual caso il browser probabilmente sostituisce alcuni valori predefiniti per loro. Domanda 1: cosa sono?

Successivamente, quando il browser sta per fare una richiesta, controlla i suoi cookie e filtra quelli che dovrebbe inviare per quella richiesta. Lo fa abbinandoli al percorso e al dominio delle richieste. Domanda 2: quali sono le regole di abbinamento?


Inserito il:

Il motivo per cui lo sto chiedendo è perché sono interessato ad alcuni casi limite. Piace:

  • Sarà disponibile un cookie .example.comper www.example.com?
  • Sarà disponibile un cookie .example.comper example.com?
  • Sarà disponibile un cookie example.comper www.example.com?
  • Sarà disponibile un cookie example.comper anotherexample.com?
  • Saranno www.example.comin grado di impostare i cookie per example.com?
  • Saranno www.example.comin grado di impostare i cookie per www2.example.com?
  • Saranno www.example.comin grado di impostare i cookie per .com?
  • Eccetera.

Aggiunto 2:

Inoltre, qualcuno potrebbe suggerire come devo impostare un cookie in modo che:

  • Può essere impostato da www.example.como example.com;
  • È accessibile da entrambi www.example.come example.com.

Risposte:


367

Sebbene esista RFC 2965 (che Set-Cookie2aveva già obsoleto RFC 2109 ) che dovrebbe definire il cookie al giorno d'oggi, la maggior parte dei browser non lo supporta completamente, ma si conforma alle specifiche originali di Netscape .

Esiste una distinzione tra il valore dell'attributo Dominio e il dominio effettivo: il primo è preso dal Set-Cookiecampo dell'intestazione e il secondo è l'interpretazione di quel valore dell'attributo. Secondo la RFC 2965, si dovrebbe applicare quanto segue:

  • Se il campo di intestazione Set-Cookie non ha un attributo Dominio , il dominio effettivo è il dominio della richiesta.
  • Se è presente un attributo Dominio , il suo valore verrà utilizzato come dominio effettivo (se il valore non inizia con un .verrà aggiunto dal client).

Avendo il dominio effettivo, deve anche corrispondere al dominio per il dominio corrente richiesto per essere impostato; altrimenti il ​​cookie verrà rivisto. La stessa regola si applica alla scelta dei cookie da inviare in una richiesta.


Mappando questa conoscenza sulle tue domande, si dovrebbe applicare quanto segue:

  • I cookie con Domain=.example.com saranno disponibili per www.esempio.com
  • I cookie con Domain=.example.com saranno disponibili per esempio.com
  • I cookie con Domain=example.comverranno convertiti in .example.come quindi saranno disponibili anche per www.esempio.com
  • Cookie con Domain=example.comsarà non disponibile per anotherexample.com
  • www.example.com sarà in grado di impostare i cookie per example.com
  • www.example.com sarà non essere in grado di biscotto set per www2.example.com
  • www.example.com sarà non essere in grado di biscotto set per .com

E per impostare e leggere un cookie per / da www.example.com e example.com , impostarlo per .www.example.come .example.comrispettivamente. Ma il primo ( .www.example.com) sarà accessibile solo per altri domini al di sotto di quel dominio (ad esempio foo.www.example.com o bar.www.example.com ) a cui è .example.compossibile accedere anche da qualsiasi altro dominio sotto example.com (ad esempio foo. esempio.com o bar.esempio.com ).


@Gumbo Quindi abcexample.com può accedere al cookie con dominio c.example.com?
Pacerier,

2
molto tardi domanda di follow-up a questo. La mia esperienza personale e questo: webmasters.stackexchange.com/questions/55790/… suggeriscono che il dominio di example.com non sarà disponibile per www.example.com, ma questo esempio suggerisce diversamente. Questo esempio è sbagliato o sono (abbastanza possibile) incomprensioni. Ci scusiamo per la negromanzia dei thread, ma volevo assicurarmi che questa eccellente risposta fosse accurata al 100% per i futuri principianti confusi come me :)
Errah,

7
questa risposta è un po 'datata; vedi la mia risposta qui sotto.
ZhongYu,

1
perché non impostare per example.com essere disponibile per www.example.com? (dato che è un "www" di example.com?
Nabeel Khan,

Set-Cookie2 è esso stesso obsoleto. Continua a utilizzare Set-Cookie.
joeforker,

122

Le risposte precedenti sono un po 'datate.

RFC 6265 è stato pubblicato nel 2011, in base al consenso del browser in quel momento. Da allora, ci sono state alcune complicazioni con i domini dei suffissi pubblici. Ho scritto un articolo che spiega la situazione attuale - http://bayou.io/draft/cookie.domain.html

Riassumendo, le regole da seguire per quanto riguarda il dominio dei cookie:

  • Il dominio di origine di un cookie è il dominio della richiesta di origine.

  • Se il dominio di origine è un IP, l'attributo di dominio del cookie non deve essere impostato.

  • Se l'attributo del dominio di un cookie non è impostato, il cookie è applicabile solo al dominio di origine.

  • Se è impostato l'attributo di dominio di un cookie,

    • il cookie è applicabile a quel dominio e a tutti i suoi sottodomini;
    • il dominio del cookie deve essere uguale o genitore al dominio di origine
    • il dominio del cookie non deve essere un TLD, un suffisso pubblico o un genitore di un suffisso pubblico.

Si può derivare che un cookie è sempre applicabile al suo dominio di origine.

Il dominio dei cookie non dovrebbe avere un punto iniziale, come in .foo.com- semplicemente usarefoo.com

Come esempio,

  • x.y.z.compuò impostare un dominio cookie a se stesso o dei genitori - x.y.z.com, y.z.com, z.com. Ma no com, che è un suffisso pubblico.
  • un cookie con domain = y.z.comè applicabile a y.z.com, x.y.z.com, a.x.y.z.cometc.

Esempi di suffissi pubblici - com, edu, uk, co.uk, blogspot.com,compute.amazonaws.com


5
@roelleor - è il contrario. rfc6265 è stato scritto per riassumere in che modo i cookie sono stati effettivamente gestiti in pratica :) sì, l'RFC è un riflesso abbastanza accurato di come si comportano i principali browser. i miei recenti test sui browser lo hanno confermato. sebbene possano differire in casi angolari che coinvolgono suffissi pubblici.
ZhongYu,

2
Quali sono le conseguenze di un punto iniziale?
UpTheCreek

3
@UpTheCreek - secondo rfc6265, il punto iniziale dovrebbe essere ignorato dal cliente
ZhongYu

2
Non è strano che x.y.z.compossa impostare un cookie z.com?
Royi Namir,

1
Quindi se xyzcom può impostare un cookie su yzcom e un cookie con dominio yzcom è applicabile a wyzcom ... Significa che xyzcom può impostare un cookie su wyzcom ?
Ioanna

9

Per una vasta copertura rivedere i contenuti di RFC2965 . Naturalmente ciò non significa necessariamente che tutti i browser si comportino esattamente allo stesso modo.

Tuttavia, in generale, la regola per Percorso predefinito se nessuno specificato nel cookie è il percorso nell'URL da cui è arrivata l'intestazione Set-Cookie. Analogamente, il valore predefinito per il dominio è il nome host completo nell'URL da cui è arrivato Set-Cookie.

Le regole di corrispondenza per il dominio richiedono che il dominio dei cookie corrisponda all'host a cui viene effettuata la richiesta. Il cookie può specificare una corrispondenza di dominio più ampia includendo *. nell'attributo di dominio di Set-Cookie (questa area in cui i browser possono variare). La corrispondenza del percorso (presupponendo che il dominio corrisponda) è una questione semplice che il percorso richiesto deve trovarsi all'interno del percorso specificato sul cookie. In genere i cookie di sessione sono impostati con path = / o path = / applicationName / quindi il cookie è disponibile per tutte le richieste nell'applicazione.


Risposta a Aggiunto:

  • Sarà disponibile un cookie per .example.com per www.example.com?
  • Un cookie per .example.com sarà disponibile per example.com? Non lo so
  • Un cookie per esempio.com sarà disponibile per www.esempio.com? Non dovrei ma ... *
  • Sarà disponibile un cookie per example.com per anotherexample.com? No
  • Www.example.com sarà in grado di impostare i cookie per example.com?
  • Www.example.com sarà in grado di impostare i cookie per www2.example.com? No (tranne tramite .example.com)
  • Www.example.com sarà in grado di impostare i cookie per .com? No (non è possibile impostare un cookie così in alto nello spazio dei nomi né è possibile impostarne uno per qualcosa come .it) .

*Non sono in grado di testarlo in questo momento, ma ho una vaga idea che almeno IE7 / 6 tratterà il percorso example.comcome se fosse .example.com.


Ho aggiunto alcuni casi limite interessanti alla mia domanda. Potresti forse lodare qualcosa al riguardo?
Vilx-

8

L'ultimo (terzo per essere esattamente) RFC per questo problema è RFC-6265 (Obsoletes RFC-2965 che a sua volta oscura RFC-2109).

In base a ciò, se il server omette l'attributo Dominio, l'agente utente restituirà il cookie solo al server di origine (il server su cui risiede una determinata risorsa). Ma sta anche avvisando che alcuni agenti utente esistenti trattano un attributo Dominio assente come se l'attributo Dominio fosse presente e contenesse il nome host corrente (Ad esempio, se example.com restituisce un'intestazione Set-Cookie senza un attributo Dominio, questi agenti utente inviare erroneamente anche il cookie a www.example.com).

Quando l'attributo Dominio è stato specificato, verrà trattato come un nome di dominio completo (se è presente il punto iniziale nell'attributo verrà ignorato). Il server deve corrispondere al dominio specificato nell'attributo (avere esattamente lo stesso nome di dominio o essere un sottodominio di esso) per ottenere questo cookie. Più precisamente specificato qui .

Quindi, per esempio:

  • l'attributo cookie Domain=.example.comè equivalente aDomain=example.com
  • i cookie con tali attributi di dominio saranno disponibili per example.com e www.example.com
  • i cookie con tali attributi di dominio non saranno disponibili per another-example.com
  • la specifica dell'attributo cookie come Domain=www.example.comchiuderà la strada per www4.example.com

PS: la virgola finale dell'attributo Dominio farà sì che l'agente utente ignori l'attributo = (


6

Ho testato tutti i casi nell'ultimo Chrome, Firefox, Safari nel 2019.

Risposta a Aggiunto:

  • Sarà disponibile un cookie per .example.com per www.example.com?
  • Un cookie per .example.com sarà disponibile per example.com?
  • Un cookie per esempio.com sarà disponibile per www.esempio.com? NO , il dominio senza carattere jolly corrisponde solo a se stesso.
  • Sarà disponibile un cookie per example.com per anotherexample.com? NO
  • Www.example.com sarà in grado di impostare i cookie per example.com? No , sarà in grado di impostare i cookie per ".example.com", ma non per "example.com".
  • Www.example.com sarà in grado di impostare i cookie per www2.example.com? NO . Ma può impostare cookie per .example.com, a cui www2.example.com può accedere.
  • Www.example.com sarà in grado di impostare i cookie per .com? NO


3

Esistono regole che determinano se un browser accetterà l'intestazione della risposta Set-header (scrittura di cookie sul lato server), regole / interpretazioni leggermente diverse per i cookie impostati tramite Javascript (non ho testato VBScript).

Quindi ci sono regole che determinano se il browser invierà un cookie insieme alla richiesta della pagina.

Esistono differenze tra i principali motori di browser nel modo in cui vengono gestite le corrispondenze di dominio e in che modo vengono interpretati i parametri nei valori del percorso. Puoi trovare alcune prove empiriche nell'articolo Come diversi browser gestiscono i cookie in modo diverso


2

Sono stato sorpreso di leggere la sezione 3.3.2 sul rifiuto dei cookie:

http://tools.ietf.org/html/rfc2965

Ciò significa che un browser dovrebbe rifiutare un cookie da xyzcom con dominio .z.com, perché "xy" contiene un punto. Quindi, a meno che io non stia interpretando male la RFC e / o le domande sopra, potrebbero esserci delle domande aggiunte:

Un cookie per .example.com sarà disponibile per www.yyy.example.com? No.

Un cookie impostato dal server di origine www.yyy.example.com, con dominio .example.com, avrà il valore inviato dall'agente utente a xxx.example.com? No.


2
che rfc è obsoleto. nuova rfc 6265, basata sul consenso del browser, consente cookie con z.comda applicare a z.come tutti i sottodomini.
ZhongYu,

1

Saranno www.example.comin grado di impostare i cookie per .com?

No, ma example.com.frpotrebbe essere possibile impostare un cookie per example2.com.fr. Firefox protegge da questo mantenendo un elenco di TLD: http://securitylabs.websense.com/content/Blogs/3108.aspx

Apparentemente Internet Explorer non consente ai domini di due lettere di impostare cookie, cosa che suppongo spiega perché o2.iereindirizzare semplicemente o2online.ie. Lo avevo spesso chiesto.


"com.fr" è konwn come "suffisso pubblico". il dominio dei cookie non può essere suffisso pubblico. vedi rfc 6265 e publicsuffix.org
ZhongYu il

Sì, c'è una soluzione, ma è estremamente disordinata. Questo tipo di etichettatura dovrebbe essere inserito nel DNS, non eseguito separatamente su base ad hoc.
TRiG

Vero, e forse ti riferisci a "Dbound". Ma ciò può creare più problemi; come, ponendo una sfida per le implementazioni del client http.
ZhongYu,

Sarebbe utile se queste informazioni fossero esposte in qualche modo dal browser a javascript. Altrimenti, è impossibile determinare a livello di codice se è possibile impostare un cookie su un determinato livello di dominio. Dopo tutto, non puoi controllare quell'elenco con ogni chiamata!
Dtipson,
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.