Come gestire più cookie con lo stesso nome?


92

Supponiamo ad esempio che io abbia un'applicazione che invia le seguenti intestazioni HTTP da impostare sul cookie denominato "a":

Set-Cookie: a=1;Path=/;Version=1
Set-Cookie: a=2;Path=/example;Version=1

Se accedo /examplesul server sono validi entrambi i percorsi, quindi ho due cookie denominati "a"! Poiché il browser non invia alcuna informazione sul percorso, i due cookie non possono essere distinti.

Cookie: a=2; a=1

Come dovrebbe essere gestito questo caso? Scegli il primo? Creare un elenco con tutti i valori dei cookie? O un caso del genere dovrebbe essere considerato un errore dello sviluppatore?


Farei del mio meglio (leggi: tutto quello che posso) per evitare nomi di cookie duplicati. La maggior parte delle persone non si è mai imbattuta in questo problema, per una buona ragione.

Il sito web può leggere solo i propri cookie. Non può leggere i cookie dell'altro sito / dominio. Questa sicurezza è garantita dal browser. Questo potrebbe essere un suggerimento per i principianti assoluti (avevo questa confusione)
Arun

Risposte:


38

Da questo articolo su SitePoint :

Se più cookie con lo stesso nome corrispondono a un determinato URI di richiesta, uno viene scelto dal browser.

Più specifico è il percorso, maggiore è la precedenza. Tuttavia, la precedenza basata su altri attributi, incluso il dominio, non è specificata e può variare tra i browser. Ciò significa che se hai impostato cookie con lo stesso nome su ".example.org" e "www.example.org", non puoi essere sicuro di quale verrà rispedito.

Modifica: queste informazioni del 2010 sembrano obsolete, sembra che i browser possano ora inviare più cookie in cambio, vedere la risposta di @Nate di seguito per i dettagli


9
Allora come si possono eliminare più cookie identici? Ho martellato su questo per due giorni ormai ei biscotti duplicati sembrano indistruttibili.
Bob Jones

13
@Brant Questo articolo potrebbe essere leggermente errato - Ho appena visto Chrome inviare due cookie con lo stesso nome (ma percorsi diversi), quindi "uno è scelto dal browser" non è necessariamente vero. Il cookie del percorso più profondo è stato inviato per primo, BTW, il che sembra ragionevole. E un altro biscotto ce l'ha fatta nel mezzo.
Jonas N

3
Anche Firefox (15) invia due cookie con lo stesso nome! se ha incontrato due cookie con dominio .a.come hosta.com
Taha Jahangir

In effetti questa informazione è sbagliata. La risposta di @Nate dovrebbe essere contrassegnata come corretta.
Dan Milon

4
404: La famosa risposta di @Nate non è stata trovata.
d.popov

90

La risposta che fa riferimento a un articolo su SitePoint non è del tutto completa. Si prega di consultare RFC 6265 (per essere onesti, questa RFC è stata rilasciata nel 2011 dopo che è stata pubblicata questa domanda, che sostituisce la precedente RFC 2965 del 2000 e RFC 2109 del 1997).

La sezione 5.4 , sottosezione 2 dice quanto segue:

L'agente utente DOVREBBE ordinare l'elenco dei cookie nel seguente ordine:

  • I cookie con percorsi più lunghi sono elencati prima dei cookie con percorsi più brevi.

NOTA: Non tutti i programmi utente ordinano l'elenco dei cookie in questo ordine, ma questo ordine riflette la pratica comune quando questo documento è stato scritto e, storicamente, ci sono stati server che (erroneamente) dipendevano da questo ordine.

C'è anche questo piccolo gioiello nella sezione 4.2.2 :

... i server NON DOVREBBERO fare affidamento sull'ordine di serializzazione. In particolare, se l'intestazione del cookie contiene due cookie con lo stesso nome (ad esempio, che sono stati impostati con attributi di percorso o dominio diversi), i server NON DOVREBBERO fare affidamento sull'ordine in cui questi cookie appaiono nell'intestazione.

Nel tuo esempio di richiesta cookie ( Cookie: a = 2; a = 1 ) nota che il cookie impostato con il percorso / esempio ( a = 2 ) ha un percorso più lungo di quello con il percorso / ( a = 1 ) e quindi ti viene rimandato prima in linea, che corrisponde alla raccomandazione della specifica. Quindi sei più o meno corretto nell'ipotesi di poter selezionare il primo valore.

Sfortunatamente il linguaggio utilizzato nelle RFC è estremamente specifico: l'uso delle parole DOVREBBE e NON DOVREBBE introdurre ambiguità nelle RFC. Indicano le convenzioni che dovrebbero essere seguite, ma non devono essere conformi alle specifiche. Sebbene comprenda abbastanza bene l'RFC per questo, non ho fatto la ricerca per vedere cosa fanno i clienti del mondo reale; è possibile uno o più browser o altri software che agiscono come HTTP client non può inviare il cookie più lungo percorso (ad esempio: / esempio ) prima nel cookie: intestazione.

Se sei in grado di controllare il valore del cookie e vuoi rendere la tua soluzione infallibile, ti conviene:

  1. utilizzando un nome di cookie diverso per eseguire l'override in determinati percorsi, ad esempio:

    • Set-cookie: a-global = 1; Path = /; Version = 1
    • Set-cookie: a-example = 2; Path = / example; Version = 1
  2. memorizzare il percorso di cui hai bisogno nel valore del cookie stesso:

    • Set-cookie: a = 1 & path = /; Path = /; Version = 1
    • Set-cookie: a = 2 & path = / example; Path = / example; Version = 1

Entrambe queste soluzioni richiedono una logica aggiuntiva sul server per scegliere il valore del cookie desiderato, confrontando l'URL richiesto con l'elenco dei cookie disponibili. Non è troppo carino. E 'un peccato l'RFC non ha avuto l'accortezza di richiedere che un percorso più lungo sostituisce completamente un cookie con un percorso più breve (ad esempio: nel tuo esempio, si riceverà Cookie: a = 2 solo ).


2
Grazie per averlo estratto da questi dannati RFC! // perché preoccuparsi di leggerli se nessuno sta seguendo queste raccomandazioni? ..
Rast

3
Sembra che Wildfly 8.0 stia prestando attenzione all'ordine dei cookie e utilizzi il primo. Questo ci consente di eseguire un'altra app in un contesto "annidato". Tuttavia, fallirebbe se alcuni browser non seguissero la raccomandazione di RFC. Il modo corretto per farlo è impostare un nome diverso del cookie di sessione, come JSESSIONID2.
honzajde

2
Ho testato i principali browser dopo aver letto la tua risposta: Chrome 63 / Opera 55 / IE11 / Edge 16 / Safari 11 / Firefox 58 E sembrano tutti gestirlo correttamente che i Cookie con percorso più lungo sono prima di quello con percorso più breve. E in PHP (testato sulla versione 7) legge solo il primo cookie impostato sulla variabile $ _COOKIE.
Alexander Schranz

1
La path=/;Path=/specifica è conforme a FRC-6265? Non ho trovato tale menzione. Tomcat minaccia qualsiasi ";" nel percorso come simbolo errato
Hubbitus

1
@ Hubbitus Presta attenzione, è a=2&path=/example;Path=/examplecosì che non ci sono ;percorsi.
Franklin Yu

2

Non c'è niente di sbagliato nell'avere più valori per lo stesso nome ... se li vuoi. Potresti persino incorporare un contesto aggiuntivo nel valore.

Se non lo fai, ovviamente nomi diversi sono una soluzione se vuoi entrambi i contesti.

L'alternativa è inviare lo stesso nome di cookie con lo stesso percorso (e dominio) anche dai percorsi più specifici. Quelle istruzioni sui cookie impostati sovrascriveranno il valore di quel cookie.

Ora che conosci la parte più importante (come funzionano) e che puoi realizzare ciò di cui hai bisogno in diversi modi, la mia risposta alla tua domanda è: questo è un problema degli sviluppatori.


0

Sono certamente a conoscenza di applicazioni che lo fanno ampiamente utilizzando più ID di sessione e sembrano funzionare in modo coerente. Tuttavia non so - e non ho intenzione di scoprirlo - se lo fanno perché il browser restituisce i cookie in un ordine coerente a seconda di quando sono stati impostati / per quale percorso sono stati impostati o se l'app cerca di abbinarli uno a una sessione esistente.

Consiglio vivamente di evitare questa pratica.

Tuttavia, se vuoi davvero sapere come i browser (e le app) gestiscono questo scenario, perché non costruire un banco di prova e provarlo.


2
Un server non ha alcun controllo su ciò che gli viene inviato dal browser. Deve ancora essere gestito.
Martin OConnor

0

Se usi il framework Java / Scala Riproduci: fai attenzione! Se una richiesta contiene più cookie con lo stesso nome, Play ne presenterà solo 1 al tuo codice.


-2

Se è necessario distinguerli, è necessario assegnare loro valori chiave diversi.

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.