Cookie zwischen Subdomain und Domain teilen

420

Ich habe zwei Fragen. Ich verstehe, dass, wenn ich die Domain als .mydomain.com(mit dem führenden Punkt) im Cookie spezifiziere , alle Subdomains ein Cookie gemeinsam nutzen können.

Kann subdomain.mydomain.comauf ein Cookie zugreifen, das in mydomain.com(ohne die wwwSubdomain) erstellt wurde?

Kann mydomain.com(ohne die wwwSubdomain) auf das Cookie zugreifen, wenn es in erstellt wurde subdomain.mydomain.com?

adam0101
quelle
3
Ja, Sie können .. siehe Link unten codeguru.com/csharp/csharp/cs_internet/article.php/c19417/…
Rahul Jain
Eng verwandt: stackoverflow.com/questions/3089199/…
Ciro Santilli 10 冠状 冠状 六四 事件 10
Können
Jayavardhan Gange
1
@ adam0101 Was ist, wenn Domain und Subdomain auf unterschiedlichen Servern gehostet werden?
user3782114
3
@ user3782114, es spielt keine Rolle, ob sie sich auf verschiedenen Servern befinden. In meinem Fall befanden sie sich nicht nur auf verschiedenen Servern, sondern jede Domäne war auf mehrere Server verteilt. Eine Sache, die uns ein bisschen aus der Fassung gebracht hat, war, dass die unteren Umgebungen (dev, test, uat usw.) auch das gleiche Cookie geteilt haben, nachdem wir dies getan hatten, weil wir sie wie "dev.oursite.com", "test" genannt hatten. ourite.com "usw. Der Trick dort (zumindest in .Net) besteht darin, für jede Umgebung einen separaten Maschinenschlüssel zu generieren und diesen in Ihrer Web.config zu speichern (vorausgesetzt, Sie transformieren die Konfiguration für jede Umgebung).
Adam0101

Antworten:

653

Die 2 - Domänen mydomain.comund subdomain.mydomain.comkönnen Cookies nur freigeben , wenn die Domäne explizit im Namen Set-CookieHeader. Andernfalls ist der Umfang des Cookies auf den Anforderungshost beschränkt. (Dies wird als "Nur-Host-Cookie" bezeichnet. Siehe Was ist ein Nur-Host-Cookie? )

Wenn Sie beispielsweise den folgenden Header von gesendet haben subdomain.mydomain.com, wird das Cookie nicht für Anforderungen an folgende Adresse gesendet mydomain.com:

Set-Cookie: name=value

Wenn Sie jedoch Folgendes verwenden, kann es auf beiden Domänen verwendet werden:

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

Dieser Cookie wird für jeden gesendet Subdomain von mydomain.com gesendet, einschließlich verschachtelter Subdomains wie subsub.subdomain.mydomain.com.

In RFC 2109 bedeutete eine Domäne ohne führenden Punkt, dass sie nicht für Subdomänen verwendet werden konnte, und nur ein führender Punkt ( .mydomain.com) ermöglichte die Verwendung für mehrere Unterdomänen (jedoch nicht für die Domäne der obersten Ebene) in der älteren Spezifikation nicht möglich).

Alle modernen Browser respektieren jedoch die neuere Spezifikation RFC 6265 und ignorieren alle führenden Punkte. Dies bedeutet, dass Sie das Cookie sowohl für Subdomains als auch für die Top-Level-Domain verwenden können.

Wenn Sie ein Cookie wie im zweiten Beispiel oben von setzen mydomain.com, ist es zusammenfassend zugänglich subdomain.mydomain.comund umgekehrt. Dies kann auch verwendet werden, um Cookies zuzulassen sub1.mydomain.comund sub2.mydomain.comzu teilen.

Siehe auch:

cmbuckley
quelle
3
Vielen Dank; Ich habe einen Hinweis zur Bedeutung des Punktes hinzugefügt.
cmbuckley
2
Ich verstehe nicht, warum Sie nicht einfach das führende "setzen" würden. auf der Domain für maximale Kompatibilität mit alten und neuen
Alan Macdonald
12
Im alten Standard ist ein Cookie mit domain=.mydomain.comnicht für die bloße mydomain.com gültig, daher sind die beiden RFCs nicht miteinander kompatibel.
cmbuckley
4
@ Frank, ja ich weiß. Mein Kommentar sollte klarstellen, dass meine Frage das Teilen von Cookies zwischen einer Domain und einer Subdomain betraf, NICHT zwischen zwei Subdomains.
Adam0101
3
Ich bin mir nicht sicher, wo ich das platzieren soll, also wähle ich die Kommentare der akzeptierten Antwort aus. Es dauerte lange und fehlgeschlagene Experimente, um das oben Genannte auf meinem lokalen Host zu beweisen, bis mir einfiel, dass ich den lokalen Host mit einem Punkt im Namen anrufen sollte. Wie "localhost.com" oder so ähnlich. Dann begannen alle Verhaltensweisen beim Setzen von Cookies gemäß den hier in dieser Antwort beschriebenen Erklärungen. Ich hoffe, das könnte jemandem helfen.
Cesc
32

Ich bin nicht sicher, ob die Antwort von @cmbuckley das vollständige Bild zeigt. Was ich lese ist:

Sofern die Attribute des Cookies nichts anderes angeben, wird das Cookie nur an den Ursprungsserver (und nicht beispielsweise an Subdomains) zurückgegeben und läuft am Ende der aktuellen Sitzung ab (wie vom Benutzeragenten definiert). Benutzerprogramme ignorieren nicht erkannte Cookies.

RFC 6265

Ebenfalls

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.

Für mich bedeutet dies, dass Sie Cookies vor dem Lesen durch Subdomain / Domain schützen können, aber nicht verhindern können, dass Cookies in die anderen Domains geschrieben werden. Daher kann jemand Ihre Website-Cookies neu schreiben, indem er eine andere Subdomain steuert, die von demselben Browser besucht wird. Was vielleicht kein großes Problem ist.

Fantastische Cookies-Testseite von @cmbuckley / für diejenigen, die sie in seiner Antwort verpasst haben, wie ich; es lohnt sich nach oben zu scrollen und zu stimmen /:

akostadinov
quelle
4
Das scheint mit dem übereinzustimmen, was ich sage: Wenn Sie kein a angeben domain, wird das Cookie nur für den Anforderungshost verwendet. Dies bedeutet, dass Set-Cookie: name=valuefrom mydomain.comnicht mit Anfragen an Subdomains gesendet wird. Spielen Sie auch mit diesem Testskript .
cmbuckley
@cmbuckley, ok, was du gesagt hast, scheint richtig zu sein. Ich werde meine Antwort umformulieren. Vielen Dank für den Hinweis.
Akostadinov
Ich muss darauf hinweisen, dass Abschnitt 4.1.2 (erstes Zitat) nicht normativ ist ...
Velda
danke für den cmbuckley link. schön zu testen, wie es schnell funktioniert.
Lawphotog
22

Hier ist ein Beispiel für die Verwendung der DOM-Cookie-API ( https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie ), damit wir das Verhalten selbst sehen können.

Wenn wir folgendes JavaScript ausführen:

document.cookie = "key = value"

Es scheint dasselbe zu sein wie das Ausführen von:

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

Der Cookie- Schlüssel wird (nur) auf der Domain mydomain.com verfügbar .


Wenn Sie nun das folgende JavaScript auf mydomain.com ausführen:

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

Die Cookie - Taste wird zur Verfügung mydomain.com sowie subdomain.mydomain.com .


Wenn Sie schließlich versuchen würden, Folgendes auf subdomain.mydomain.com auszuführen:

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

Wird der Cookie- Schlüssel für subdomain.mydomain.com verfügbar ? Ich war ein bisschen überrascht, dass dies erlaubt ist; Ich hatte angenommen, dass es eine Sicherheitsverletzung für eine Subdomain wäre, ein Cookie für eine übergeordnete Domain setzen zu können.

llambda
quelle
1
Daher frage ich mich, ob es separate Spezifikationen gibt, die das Verhalten von httponlyCookies im Vergleich zu der Art von Cookies beschreiben, die Sie erstellen.
Adam0101
3
Die von Ihnen veröffentlichten Dokumente stimmen nicht mit Ihren Aussagen überein. Die ersten beiden Beispiele sind nicht äquivalent (ein domainAttribut bewirkt, dass das Cookie für Subdomänen funktioniert; kein solches Attribut funktioniert nicht). Führende Punkte werden bestenfalls ignoriert und im schlimmsten Fall aktiv blockiert.
cmbuckley
Dies ist die beste Lösung, wenn Sie sich nicht auf Host-Header verlassen möchten. Ich habe es überprüft und es funktioniert
Szymon
14

Bitte beachten Sie, dass Sie ein Cookie aus einer Subdomain in einer Domain setzen können.

(in der Antwort für die Anfrage gesendet subdomain.mydomain.com)

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

Sie können jedoch kein Cookie von einer Domain in einer Subdomain setzen.

(in der Antwort für die Anfrage gesendet mydomain.com)

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

WARUM ?

Gemäß den Spezifikationen RFC 6265 Abschnitt 5.3.6 Speichermodell

Wenn der kanonisierte Anforderungshost nicht mit dem Domänenattribut übereinstimmt : Ignorieren Sie das Cookie vollständig und brechen Sie diese Schritte ab.

und RFC 6265 Abschnitt 5.1.3 Domain Matching

Domain Matching

Eine Zeichenfolgendomäne stimmt mit einer bestimmten Domänenzeichenfolge überein, wenn mindestens eine der folgenden Bedingungen erfüllt ist:

  1. Die Domänenzeichenfolge und die Zeichenfolge sind identisch. (Beachten Sie, dass sowohl die Domänenzeichenfolge als auch die Zeichenfolge zu diesem Zeitpunkt in Kleinbuchstaben kanonisiert wurden.)

  2. Alle folgenden Bedingungen gelten:

    • Die Domänenzeichenfolge ist ein Suffix der Zeichenfolge.

    • Das letzte Zeichen der Zeichenfolge, das nicht in der Domänenzeichenfolge enthalten ist, ist ein% x2E-Zeichen (".").

    • Die Zeichenfolge ist ein Hostname (dh keine IP-Adresse).

Die Domain "subdomain.mydomain.com" stimmt also mit "mydomain.com" überein, aber "mydomain.com" stimmt NICHT mit der Domain "subdomain.mydomain.com" überein.

Überprüfen Sie auch diese Antwort .

Buchhalter م
quelle
Dies war die hilfreichste Antwort für mich.
Toby
3

In beiden Fällen ist dies der Fall, und dies ist das Standardverhalten für IE und Edge.

Die anderen Antworten liefern wertvolle Erkenntnisse, beschreiben jedoch hauptsächlich das Verhalten in Chrome. Es ist wichtig zu beachten, dass das Verhalten im IE völlig anders ist. Das sehr hilfreiche Testskript von CMBuckley zeigt, dass in (z. B.) Chrome die Cookies nicht zwischen Root- und Subdomains geteilt werden, wenn keine Domain angegeben ist. Der gleiche Test im IE zeigt jedoch, dass sie gemeinsam genutzt werden. Dieser IE-Fall entspricht eher der Beschreibung zum Mitnehmen im CMBuckley-Link www-or-not-www. Ich weiß, dass dies der Fall ist, weil wir ein System haben, das verschiedene Service-Stack-Cookies sowohl im Root als auch in der Subdomain verwendet. Es hat alles gut funktioniert, bis jemand im IE darauf zugegriffen hat und die beiden Systeme darüber gestritten haben, wessen Sitzungscookie gewinnen würde, bis wir den Cache in die Luft gesprengt haben.

DannyW
quelle
0

Seien Sie vorsichtig, wenn Sie an localhost arbeiten! Wenn Sie Ihren Cookie in js wie folgt speichern:

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

Es ist möglicherweise nicht für Ihre Subdomain zugänglich, wie z sub.localhost. Um dieses Problem zu lösen, müssen Sie Virtual Host verwenden . Zum Beispiel können Sie Ihren virtuellen Host mit konfigurieren, ServerName localhost.comdann können Sie Ihr Cookie wie folgt in Ihrer Domain und Subdomain speichern:

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

Einfache Lösung

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

Der 5. Parameter von Setcookie bestimmt die (Unter-) Domänen, für die das Cookie verfügbar ist. Wenn Sie es auf (BEISPIEL.COM) setzen, steht es jeder Subdomain zur Verfügung (z. B. SUBDOMAIN.EXAMPLE.COM).

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

Gesetze
quelle
17
Diese Frage ist nicht PHP-spezifisch, ich glaube nicht, dass sie als gültig qualifiziert ist.
Sergelerator
1
Sergelerator, ich habe keine Frage gestellt. Ich habe auf das OP reagiert.
Gesetze
4
@Lawes Ich glaube, Sergelator bedeutet, dass die Frage des OP nicht PHP-spezifisch ist, während Ihre Antwort eine reine PHP-Lösung zu sein scheint, daher würde sie sich nicht für die Frage des OP qualifizieren.
Mirage