Wie gehe ich mit mehreren Cookies mit demselben Namen um?

87

Angenommen, ich hatte eine Anwendung, die die folgenden HTTP-Header gesendet hat, um das Cookie "a" zu setzen:

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

Wenn ich /exampleauf dem Server zugreife, sind beide Pfade gültig, daher habe ich zwei Cookies mit dem Namen "a"! Da der Browser keine Pfadinformationen sendet, können die beiden Cookies nicht unterschieden werden.

Cookie: a=2; a=1

Wie soll dieser Fall behandelt werden? Den ersten auswählen? Eine Liste mit allen Cookie-Werten erstellen? Oder sollte ein solcher Fall als Fehler eines Entwicklers angesehen werden?

Deamon
quelle
Ich würde mein Bestes geben (lesen Sie: alles, was ich kann), um doppelte Cookie-Namen zu vermeiden. Die meisten Menschen sind aus gutem Grund noch nie auf dieses Problem gestoßen.
Die Website kann nur eigene Cookies lesen. Cookies der anderen Website / Domain können nicht gelesen werden. Diese Sicherheit wird vom Browser gewährleistet. Dies kann ein Tipp für absolute Anfänger sein (ich hatte diese Verwirrung)
Arun

Antworten:

38

Aus diesem Artikel auf SitePoint :

Wenn mehrere gleichnamige Cookies mit einem bestimmten Anforderungs-URI übereinstimmen, wird eines vom Browser ausgewählt.

Je spezifischer der Pfad, desto höher die Priorität. Die auf anderen Attributen, einschließlich der Domäne, basierende Priorität ist jedoch nicht angegeben und kann zwischen den Browsern variieren. Dies bedeutet, dass Sie nicht sicher sein können, welche Cookies zurückgesendet werden, wenn Sie gleichnamige Cookies für ".example.org" und "www.example.org" gesetzt haben.

Bearbeiten: Diese Informationen aus dem Jahr 2010 scheinen veraltet zu sein. Es scheint, dass Browser jetzt mehrere Cookies zurücksenden können. Weitere Informationen finden Sie in der Antwort von @Nate unten

Jan M.
quelle
8
Wie kann man also mehrere identische Cookies löschen? Ich habe jetzt seit zwei Tagen darauf gehämmert und die doppelten Kekse scheinen unzerstörbar.
Bob Jones
13
@Brant Dieser Artikel ist möglicherweise etwas falsch - ich habe gerade gesehen, dass Chrome zwei Cookies mit demselben Namen (aber unterschiedlichen Pfaden) zurückgesendet hat, sodass "eines wird vom Browser ausgewählt" nicht unbedingt wahr ist. Der Cookie mit dem tiefsten Pfad wurde zuerst gesendet, übrigens, was vernünftig erscheint. Und ein anderer Keks hat es auch dazwischen geschafft.
Jonas N
3
Firefox (15) sendet auch zwei gleichnamige Cookies! wenn es mit zwei Cookies mit für Domain .a.comund Hosta.com
Taha Jahangir
In der Tat ist diese Information falsch. Die Antwort von @Nate sollte ich als richtig markieren.
Dan Milon
3
404: Die Antwort des berühmten @ Nate wurde nicht gefunden.
d.popov
86

Die Antwort auf einen Artikel in SitePoint ist nicht vollständig. Bitte beachten Sie RFC 6265 (um fair zu sein, dieser RFC wurde 2011 veröffentlicht, nachdem diese Frage gestellt wurde, die den vorherigen RFC 2965 aus dem Jahr 2000 und den RFC 2109 aus dem Jahr 1997 ersetzt).

In Abschnitt 5.4 , Unterabschnitt 2 heißt es:

Der Benutzeragent sollte die Cookie-Liste in der folgenden Reihenfolge sortieren:

  • Cookies mit längeren Pfaden werden vor Cookies mit kürzeren Pfaden aufgelistet.

HINWEIS: Nicht alle Benutzeragenten sortieren die Cookie-Liste in dieser Reihenfolge, aber diese Reihenfolge spiegelt die gängige Praxis wider, als dieses Dokument geschrieben wurde, und in der Vergangenheit gab es Server, die (fälschlicherweise) von dieser Reihenfolge abhingen.

Es gibt auch dieses kleine Juwel in Abschnitt 4.2.2 :

... Server sollten sich NICHT auf die Serialisierungsreihenfolge verlassen. Insbesondere wenn der Cookie-Header zwei Cookies mit demselben Namen enthält (z. B. die mit unterschiedlichen Pfad- oder Domänenattributen festgelegt wurden), sollten sich Server NICHT auf die Reihenfolge verlassen, in der diese Cookies im Header angezeigt werden.

Beachten Sie in Ihrem Beispiel-Anforderungscookie ( Cookie: a = 2; a = 1 ), dass das mit dem Pfad / Beispiel ( a = 2 ) gesetzte Cookie einen längeren Pfad hat als das mit dem Pfad / ( a = 1 ) wird zuerst in der Zeile an Sie zurückgeschickt, was der Empfehlung der Spezifikation entspricht. Sie gehen also mehr oder weniger richtig davon aus, dass Sie den ersten Wert auswählen könnten .

Leider ist die in RFCs verwendete Sprache äußerst spezifisch - die Verwendung der Wörter SOLLTE und SOLLTE NICHT zu Mehrdeutigkeiten in RFCs führen. Diese zeigen an Konventionen, sollte beachtet werden, sind aber nicht erforderlich , um die Spezifikation sein konformen. Obwohl ich den RFC dafür recht gut verstehe, habe ich nicht nachgeforscht, was Kunden in der realen Welt tun. Es ist möglich, dass ein oder mehrere Browser oder andere Software, die als HTTP-Clients fungieren, das Cookie mit dem längsten Pfad (z. B. / Beispiel ) nicht zuerst im Cookie: -Header senden .

Wenn Sie in der Lage sind, den Wert des Cookies zu kontrollieren und Ihre Lösung kinderleicht machen möchten, sind Sie entweder am besten dran:

  1. Verwenden eines anderen Cookie-Namens zum Überschreiben bestimmter Pfade, z.

    • Set-Cookie: a-global = 1; Pfad = /; Version = 1
    • Set-Cookie: a-Beispiel = 2; Pfad = / Beispiel; Version = 1
  2. Speichern Sie den gewünschten Pfad im Cookie-Wert selbst:

    • Set-Cookie: a = 1 & path = /; Path = /; Version = 1
    • Set-Cookie: a = 2 & Pfad = / Beispiel; Pfad = / Beispiel; Version = 1

Für beide Problemumgehungen ist zusätzliche Logik auf dem Server erforderlich, um den gewünschten Cookie-Wert auszuwählen, indem die angeforderte URL mit der Liste der verfügbaren Cookies verglichen wird. Es ist nicht zu hübsch. Es ist bedauerlich , der RFC nicht die Weitsicht hat zu verlangen , dass ein längerer Weg vollständig ein Cookie mit einem kürzeren Pfad überschreibt (zB: in Ihrem Beispiel, würden Sie erhalten Cookie: a = 2 nur ).

Kriegsähnlicher Schimpanse
quelle
2
Vielen Dank, dass Sie dies aus diesen verdammten RFCs herausgegraben haben! // Warum sollte man sie überhaupt lesen, wenn niemand diesen Empfehlungen folgt? ..
Rast
3
Es sieht so aus, als würde Wildfly 8.0 auf die Reihenfolge der Cookies achten und das erste verwenden. Auf diese Weise können wir eine andere App in einem verschachtelten Kontext ausführen. Es würde jedoch fehlschlagen, wenn einige Browser der Empfehlung von RFC nicht folgen. Richtige Vorgehensweise, um einen anderen Namen für das Sitzungscookie festzulegen, z. B. JSESSIONID2.
Honzajde
1
Ich habe die wichtigsten Browser getestet, nachdem ich Ihre Antwort gelesen hatte: Chrome 63 / Opera 55 / IE11 / Edge 16 / Safari 11 / Firefox 58 Und alle scheinen richtig damit umzugehen, dass das Cookie mit dem längeren Pfad vor dem Cookie mit dem kürzeren Pfad steht. In PHP (getestet in Version 7) wird nur das erste Cookie gelesen, das auf die Variable $ _COOKIE gesetzt ist.
Alexander Schranz
1
Entspricht die path=/;Path=/Spezifikation FRC-6265? Ich habe eine solche Erwähnung nicht gefunden. Tomcat bedroht jedes ";" im Pfad als falsches Symbol
Hubbitus
1
@Hubbitus Pass auf, es ist a=2&path=/example;Path=/exampleso, dass es keinen ;Pfad gibt.
Franklin Yu
2

Es ist nichts Falsches daran, mehrere Werte für denselben Namen zu haben ... wenn Sie sie möchten. Sie können sogar zusätzlichen Kontext in den Wert einbetten.

Wenn Sie dies nicht tun, sind natürlich unterschiedliche Namen eine Lösung, wenn Sie beide Kontexte möchten.

Die Alternative besteht darin, denselben Cookie-Namen mit demselben Pfad (und derselben Domäne) auch über die spezifischeren Pfade zu senden. Diese festgelegten Cookie-Anweisungen überschreiben den Wert dieses Cookies.

Nachdem Sie nun den wichtigsten Teil (wie sie funktionieren) kennen und das, was Sie benötigen, auf verschiedene Arten erreichen können, lautet meine Antwort auf Ihre Frage: Dies ist ein Entwicklerproblem.

Gerard ONeill
quelle
0

Mir sind sicherlich Anwendungen bekannt, die dies ausgiebig mit mehreren Sitzungs-IDs tun - und anscheinend konsistent funktionieren. Ich weiß jedoch nicht - und habe auch nicht die Absicht herauszufinden -, ob dies der Fall ist, da der Browser die Cookies in einer einheitlichen Reihenfolge zurückgibt, je nachdem, wann sie festgelegt wurden / für welchen Pfad sie festgelegt wurden oder ob die App versucht, mit den einzelnen Cookies übereinzustimmen eine zu einer bestehenden Sitzung.

Ich würde dringend empfehlen, diese Praxis zu vermeiden.

Wenn Sie jedoch wirklich wissen möchten, wie die Browser (und Apps) mit diesem Szenario umgehen, bauen Sie einen Prüfstand und probieren Sie ihn aus.

symcbean
quelle
2
Ein Server hat keine Kontrolle darüber, was vom Browser an ihn gesendet wird. Es muss noch gehandhabt werden.
Martin OConnor
0

Wenn Sie das Java / Scala-Framework verwenden Spielen: Achtung! Wenn eine Anfrage mehrere Cookies mit demselben Namen enthält, zeigt Play Ihrem Code nur 1 davon an.

Erik van Oosten
quelle
-2

Wenn Sie sie unterscheiden müssen, müssen Sie ihnen unterschiedliche Schlüsselwerte geben.

Joghurt
quelle