705 Stimmen

Cookies zwischen Subdomain und Domain teilen

Ich habe zwei Fragen. Mir ist klar, dass wenn ich die Domain als .example.com (mit dem führenden Punkt) im Cookie angebe, alle Subdomains das Cookie teilen können.

Kann subdomain.example.com auf ein Cookie zugreifen, das in example.com (ohne die Subdomain www) erstellt wurde?

Kann example.com (ohne die Subdomain www) auf das Cookie zugreifen, wenn es in subdomain.example.com erstellt wurde?

1080voto

cmbuckley Punkte 36915

Wenn Sie ein Cookie wie folgt einstellen:

Set-Cookie: name=value

dann gilt das Cookie nur für die Anforderungsdomäne und wird nur für Anforderungen an die genau gleiche Domäne gesendet, nicht an andere Subdomänen. (Siehe Was ist ein "host only" Cookie?)

Zwei verschiedene Domänen (z. B. example.com und subdomain.example.com oder sub1.example.com und sub2.example.com) können nur Cookies teilen, wenn das domain Attribut im Header vorhanden ist:

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

Das domain Attribut muss mit der Anforderungs-URL übereinstimmen, damit es gültig ist, was im Grunde bedeutet, dass es die Anforderungsdomäne oder eine "Eltern" Domäne sein muss. Dies gilt also für beide Beispiele in der Frage sowie für das Teilen zwischen zwei separaten Subdomänen.

Dieses Cookie würde dann für example.com und alle Subdomänen von example.com gesendet werden, einschließlich verschachtelter Subdomänen wie subsub.subdomain.example.com. (Bitte beachten Sie, dass es auch andere Attribute gibt, die den Geltungsbereich des Cookies einschränken und wann es vom Browser gesendet wird, wie path oder Secure).

Aufgrund der Funktionsweise des Domain-Matchings, wenn Sie möchten, dass sub1.example.com und sub2.example.com Cookies teilen, teilen Sie sie dann auch mit sub3.example.com.

Siehe auch:


Eine Anmerkung zu führenden Punkten in domain Attributen: In der frühen RFC 2109 konnten nur Domänen mit einem führenden Punkt (domain=.example.com) über Subdomänen hinweg verwendet werden. Aber dies konnte nicht mit der Top-Level-Domäne geteilt werden, daher war das, was Sie fragen, im älteren Spezifikation nicht möglich.

Die neuere Spezifikation RFC 6265 ignoriert jedoch jeden führenden Punkt, was bedeutet, dass Sie das Cookie auch auf Subdomänen sowie auf der Top-Level-Domäne verwenden können.

139voto

Accountant م Punkte 5859

Bitte beachten Sie alle, dass Sie von einem Subdomain auf eine Domain ein Cookie setzen können.

(gesendet als Antwort auf die Anforderung von subdomain.example.com)

Set-Cookie: name=value; Domain=example.com // GUT

Aber Sie können kein Cookie von einer Domain auf eine Subdomain setzen.

(gesendet als Antwort auf die Anforderung von example.com)

Set-Cookie: name=value; Domain=subdomain.example.com // Browser lehnt Cookie ab

Warum?

Laut den Spezifikationen, RFC 6265 Abschnitt 5.3.6 Speichermodell,

Wenn das kanonisierte Anfrage-Host nicht mit der Domain-Attribut übereinstimmt: Ignorieren Sie das Cookie vollständig und brechen Sie diese Schritte ab.

und RFC 6265 Abschnitt 5.1.3 Domain-Übereinstimmung,

Domain-Übereinstimmung

Ein Zeichenfolge übereinstimmt einer gegebenen Domain-Zeichenfolge, wenn mindestens eine der folgenden Bedingungen erfüllt ist:

  1. Die Domain-Zeichenfolge und die Zeichenfolge sind identisch. (Beachten Sie, dass sowohl die Domain-Zeichenfolge als auch die Zeichenfolge zu diesem Zeitpunkt in Kleinbuchstaben kanonisiert worden sein werden.)

  2. Alle folgenden Bedingungen sind erfüllt:

    • Die Domain-Zeichenfolge ist ein Suffix der Zeichenfolge.

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

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

Also übereinstimmt subdomain.example.com mit example.com, aber example.com übereinstimmt nicht mit subdomain.example.com

Überprüfen Sie auch diese Antwort.

48voto

akostadinov Punkte 16114

Ich bin mir nicht sicher, ob cmbuckleys Antwort das ganze Bild zeigt. Was ich gelesen habe:

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

RFC 6265

Außerdem

8.6.  Schwache Integrität

   Cookies bieten keine Integritätsgarantien für Geschwisterdomains (und
   deren Subdomains).  Zum Beispiel, betrachten Sie foo.example.com und
   bar.example.com.  Der Server von foo.example.com kann ein Cookie mit einem
   Domain-Attribut von "example.com" setzen (möglicherweise ein bestehendes
   "example.com" Cookie überschreibend, das von bar.example.com gesetzt wurde), und
   der Benutzeragent wird dieses Cookie in HTTP-Anfragen an bar.example.com einbeziehen.
   Im schlimmsten Fall wird bar.example.com dieses Cookie nicht von einem Cookie, das es selbst gesetzt hat, unterscheiden können.
   Der Server von foo.example.com kann diese Fähigkeit möglicherweise ausnutzen, um einen Angriff gegen bar.example.com zu starten.

Das bedeutet für mich, dass man Cookies davor schützen kann, von Subdomain/Domain gelesen zu werden, aber nicht das Schreiben von Cookies auf anderen Domains verhindern kann. Somit könnte jemand die Cookies Ihrer Website neu schreiben, indem er eine andere Subdomain kontrolliert, die vom selben Browser besucht wird. Was möglicherweise kein großes Problem darstellt.

Tolle Cookies-Testseite bereitgestellt von cmbuckley und für diejenigen, die es in seiner Antwort wie ich verpasst haben; es lohnt sich, nach oben zu scrollen.

31voto

lammy Punkte 3925

Hier ist ein Beispiel für die Verwendung der DOM-Cookie-API, damit wir das Verhalten selbst sehen können.

Wenn wir den folgenden JavaScript-Code ausführen,

document.cookie = "Schlüssel=Wert"

scheint es dasselbe zu sein wie:

document.cookie = "Schlüssel=Wert;Domain=beispiel.com"

Das Cookie Schlüssel wird nur auf der Domain beispiel.com verfügbar.


Jetzt, wenn Sie den folgenden JavaScript-Code auf beispiel.com ausführen,

document.cookie = "Schlüssel=Wert;Domain=.beispiel.com"

wird das Cookie Schlüssel auch für beispiel.com sowie subdomain.beispiel.com verfügbar.


Schließlich, wenn Sie versuchen, den folgenden Code auf subdomain.beispiel.com auszuführen,

document.cookie = "Schlüssel=Wert;Domain=.beispiel.com"

wird das Cookie Schlüssel für subdomain.beispiel.com verfügbar? Ich war ein wenig überrascht, dass dies erlaubt ist; ich hatte angenommen, dass es ein Sicherheitsverstoß wäre, wenn eine Subdomain in der Lage wäre, ein Cookie auf einer übergeordneten Domain zu setzen.

6voto

Lenny4 Punkte 1195

Vorsicht, wenn Sie auf localhost arbeiten! Wenn Sie Ihren Cookie in JavaScript wie folgt speichern:

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

Könnte es für Ihre Subdomain, wie sub.localhost, nicht zugänglich sein. Um dieses Problem zu lösen, müssen Sie VirtualHost verwenden. Zum Beispiel können Sie Ihren Virtuellen Host mit ServerName localhost.com konfigurieren, und dann können Sie Ihren Cookie auf Ihrer Domain und Subdomain wie folgt speichern:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X