Wie funktionieren Browser-Cookie-Domains?

380

Aufgrund seltsamer Probleme mit Domain- / Subdomain-Cookies, die ich bekomme, möchte ich wissen, wie Browser mit Cookies umgehen. Wenn sie es auf unterschiedliche Weise tun, wäre es auch schön, die Unterschiede zu kennen.

Mit anderen Worten: Wenn ein Browser ein Cookie empfängt, kann diesem Cookie eine Domain und ein Pfad zugeordnet sein. Oder auch nicht. In diesem Fall ersetzt der Browser wahrscheinlich einige Standardeinstellungen. Frage 1: Was sind sie?

Später, wenn der Browser eine Anfrage stellen möchte, überprüft er seine Cookies und filtert diejenigen heraus, die er für diese Anfrage senden soll. Dazu werden sie mit dem Anforderungspfad und der Domäne abgeglichen. Frage 2: Was sind die Matching-Regeln?


Hinzugefügt:

Der Grund, warum ich das frage, ist, dass ich an einigen Randfällen interessiert bin. Mögen:

  • Wird ein Cookie für .example.comverfügbar sein www.example.com?
  • Wird ein Cookie für .example.comverfügbar sein example.com?
  • Wird ein Cookie für example.comverfügbar sein www.example.com?
  • Wird ein Cookie für example.comverfügbar sein anotherexample.com?
  • Kann www.example.comein Cookie gesetzt werden example.com?
  • Kann www.example.comein Cookie gesetzt werden www2.example.com?
  • Kann www.example.comein Cookie gesetzt werden .com?
  • Usw.

Hinzugefügt 2:

Könnte auch jemand vorschlagen, wie ich ein Cookie setzen soll, damit:

  • Es kann entweder www.example.comoder eingestellt werden example.com;
  • Es ist sowohl für www.example.comals auch zugänglich example.com.
Vilx-
quelle

Antworten:

367

Obwohl es das ist RFC 2965 ( Set-Cookie2hatte bereits veraltet RFC 2109 ), der sollte das Cookie heute definiert, die meisten Browser nicht vollständig , dass unterstützen , sondern nur auf die erfüllen ursprüngliche Spezifikation von Netscape .

Es gibt einen Unterschied zwischen dem Domänenattributwert und der effektiven Domäne: Ersteres wird aus dem Set-CookieHeaderfeld entnommen und letzteres ist die Interpretation dieses Attributwerts. Gemäß RFC 2965 sollte Folgendes gelten:

  • Wenn das Set-Cookie - Header - Feld nicht einen hat Domain - Attribut ist die effektive Domain die Domain des Antrags.
  • Wenn ein Domain- Attribut vorhanden ist, wird sein Wert als effektive Domain verwendet (wenn der Wert nicht mit einem beginnt ., wird er vom Client hinzugefügt).

Mit der effektiven Domain muss sie auch mit der aktuell angeforderten Domain übereinstimmen, damit sie festgelegt wird. Andernfalls wird der Cookie überarbeitet. Die gleiche Regel gilt für die Auswahl der Cookies, die in einer Anfrage gesendet werden sollen.


Wenn Sie dieses Wissen auf Ihre Fragen abbilden, sollte Folgendes zutreffen:

  • Cookie mit Domain=.example.com wird für www.example.com verfügbar sein
  • Cookie mit Domain=.example.com wird verfügbar sein für example.com
  • Cookie mit Domain=example.comwird umgewandelt werden .example.comund somit wird ebenfalls verfügbar sein für www.example.com
  • Cookies mit Domain=example.comsind für anotherexample.com nicht verfügbar
  • www.example.com kann Cookies für example.com setzen
  • www.example.com kann kein Cookie für www2.example.com setzen
  • www.example.com kann kein Cookie für .com setzen

Und zu setzen und lesen ein Cookie für / von www.example.com und example.com , stellen sie für .www.example.comund .example.comjeweils. Auf first ( .www.example.com) kann jedoch nur für andere Domains unterhalb dieser Domain (z. B. foo.www.example.com oder bar.www.example.com ) .example.comzugegriffen werden, auf die auch jede andere Domain unterhalb von example.com (z . B. foo ) zugreifen kann . example.com oder bar.example.com ).

Gumbo
quelle
@Gumbo Also kann abcexample.com mit der Domain c.example.com auf das Cookie zugreifen?
Pacerier
2
sehr späte Folgefrage zu dieser. Meine eigene Erfahrung und dies: webmasters.stackexchange.com/questions/55790/… legen nahe, dass die Domain von example.com für www.example.com nicht verfügbar ist, aber dieses Beispiel schlägt etwas anderes vor. Ist dieses Beispiel falsch oder verstehe ich es (durchaus möglich) falsch? Entschuldigung für die Thread-Nekromantie, aber ich wollte sicherstellen, dass diese ausgezeichnete Antwort für zukünftige verwirrte Neulinge wie mich 100% genau ist :)
errah
7
Diese Antwort ist etwas veraltet. siehe meine Antwort unten.
ZhongYu
1
Warum nicht die Einstellung für example.com für www.example.com verfügbar sein? (Wie ist es ein "www" Sub von example.com?
Nabeel Khan
Set-Cookie2 ist selbst veraltet. Verwenden Sie weiterhin Set-Cookie.
Joeforker
122

Die vorherigen Antworten sind etwas veraltet.

RFC 6265 wurde 2011 auf der Grundlage des damaligen Browser-Konsenses veröffentlicht. Seitdem gab es einige Komplikationen mit öffentlichen Suffixdomänen. Ich habe einen Artikel geschrieben, der die aktuelle Situation erklärt - http://bayou.io/draft/cookie.domain.html

Zusammenfassend sind die Regeln für die Cookie-Domain zu beachten:

  • Die Ursprungsdomäne eines Cookies ist die Domäne der Ursprungsanforderung.

  • Wenn die Ursprungsdomäne eine IP ist, darf das Domänenattribut des Cookies nicht festgelegt werden.

  • Wenn das Domänenattribut eines Cookies nicht festgelegt ist, gilt das Cookie nur für seine Ursprungsdomäne.

  • Wenn das Domain-Attribut eines Cookies festgelegt ist,

    • Das Cookie gilt für diese Domain und alle ihre Subdomains.
    • Die Domain des Cookies muss mit der Ursprungsdomäne identisch oder deren Eltern sein
    • Die Domain des Cookies darf keine TLD, kein öffentliches Suffix oder ein übergeordnetes Element eines öffentlichen Suffix sein.

Es kann abgeleitet werden, dass ein Cookie immer auf seine Ursprungsdomäne anwendbar ist.

Die Cookie-Domain sollte keinen führenden Punkt haben, wie in .foo.com- einfach verwendenfoo.com

Als Beispiel,

  • x.y.z.comeinstellen , dass ein Cookie - Domain an sich selbst oder Eltern - x.y.z.com, y.z.com, z.com. Aber nicht com, was ein öffentliches Suffix ist.
  • ein Cookie mit domain = y.z.comist anwendbar auf y.z.com, x.y.z.com, a.x.y.z.comusw.

Beispiele für öffentliche Suffixe - com, edu, uk, co.uk, blogspot.com,compute.amazonaws.com

ZhongYu
quelle
5
@roelleor - es ist umgekehrt. rfc6265 wurde geschrieben, um zusammenzufassen, wie Cookies in der Praxis tatsächlich gehandhabt wurden :) Ja, der rfc spiegelt ziemlich genau wider, wie sich die wichtigsten Browser verhalten. Meine letzten Tests mit Browsern haben dies bestätigt. Sie können sich jedoch in Eckfällen mit öffentlichen Suffixen unterscheiden.
ZhongYu
2
Was sind die Konsequenzen eines führenden Punktes?
UpTheCreek
3
@UpTheCreek - laut rfc6265 sollte der führende Punkt vom Client ignoriert werden
ZhongYu
2
Ist es nicht seltsam, dass x.y.z.comein Cookie gesetzt werden kann z.com?
Royi Namir
1
Wenn xyzcom ein Cookie auf yzcom setzen kann und ein Cookie mit der Domain yzcom auf wyzcom anwendbar ist ... Bedeutet das, dass xyzcom ein Cookie auf wyzcom setzen kann ?
Ioanna
9

Für eine umfassende Berichterstattung lesen Sie den Inhalt von RFC2965 . Das bedeutet natürlich nicht unbedingt, dass sich alle Browser genau gleich verhalten.

Im Allgemeinen ist die Regel für den Standardpfad, wenn im Cookie keine angegeben ist, der Pfad in der URL, von der der Set-Cookie-Header angekommen ist. In ähnlicher Weise ist der Standard für die Domain der vollständige Hostname in der URL, von der das Set-Cookie eingetroffen ist.

Für Übereinstimmungsregeln für die Domäne muss die Cookie-Domäne mit dem Host übereinstimmen, an den die Anforderung gestellt wird. Das Cookie kann eine breitere Domain-Übereinstimmung durch include * angeben. im Domain-Attribut von Set-Cookie (dieser Bereich, in dem Browser variieren können). Das Abgleichen des Pfads (unter der Annahme, dass die Domäne übereinstimmt) ist eine einfache Sache, bei der der angeforderte Pfad innerhalb des im Cookie angegebenen Pfads liegen muss. In der Regel werden Sitzungscookies mit path = / oder path = / applicationName / gesetzt, sodass das Cookie für alle Anforderungen in der Anwendung verfügbar ist.


Antwort auf Hinzugefügt:

  • Wird ein Cookie für .example.com für www.example.com verfügbar sein? Ja
  • Wird ein Cookie für .example.com für example.com verfügbar sein? Weiß nicht
  • Wird ein Cookie für example.com für www.example.com verfügbar sein? Sollte nicht aber ... *
  • Wird ein Cookie für example.com für anotherexample.com verfügbar sein? Nein
  • Kann www.example.com Cookies für example.com setzen? Ja
  • Kann www.example.com ein Cookie für www2.example.com setzen? Nein (außer über .example.com)
  • Kann www.example.com Cookies für .com setzen? Nein (Sie können kein Cookie so hoch im Namespace setzen, noch können Sie eines für etwas wie .co.uk setzen) .

*Ich kann dies derzeit nicht testen, aber ich habe eine Ahnung, dass mindestens IE7 / 6 den Pfad example.comso behandeln würde, als ob er es wäre .example.com.

AnthonyWJones
quelle
Ich habe meiner Frage einige interessante Randfälle hinzugefügt. Könnten Sie vielleicht etwas dazu empfehlen?
Vilx
8

Der letzte (dritte, um genau zu sein) RFC für dieses Problem ist RFC-6265 (Veraltet RFC-2965, der wiederum RFC-2109 veraltet).

Nach ihr , wenn der Server des Domain - Attribut weglässt, wird die User - Agent das Cookie nur zurück an den Ursprungsserver (der Server , auf dem eine bestimmte Ressource befindet). Es wird jedoch auch gewarnt, dass einige vorhandene Benutzeragenten ein fehlendes Domänenattribut so behandeln, als ob das Domänenattribut vorhanden wäre und den aktuellen Hostnamen enthält (wenn example.com beispielsweise einen Set-Cookie-Header ohne Domänenattribut zurückgibt, werden diese Benutzeragenten dies tun Senden Sie den Cookie fälschlicherweise auch an www.example.com.

Wenn das Domain-Attribut angegeben wurde, wird es als vollständiger Domain-Name behandelt (wenn der führende Punkt im Attribut vorhanden ist, wird er ignoriert). Der Server sollte mit der im Attribut angegebenen Domäne übereinstimmen (genau denselben Domänennamen haben oder eine Unterdomäne davon sein), um dieses Cookie zu erhalten. Genauer gesagt hier angegeben .

Also zum Beispiel:

  • Das Cookie-Attribut Domain=.example.comentsprichtDomain=example.com
  • Cookies mit einer solchen Domain Attribute werden zur Verfügung für example.com und www.example.com
  • Cookies mit solchen Domain-Attributen sind für another-example.com nicht verfügbar
  • Wenn Sie ein Cookie-Attribut wie angeben,Domain=www.example.com wird der Weg für www4.example.com geschlossen

PS: Durch ein nachfolgendes Komma im Domänenattribut ignoriert der Benutzeragent das Attribut = (

Victor Akimov
quelle
6

Ich habe alle Fälle in der neuesten Version von Chrome, Firefox und Safari im Jahr 2019 getestet.

Antwort auf Hinzugefügt:

  • Wird ein Cookie für .example.com für www.example.com verfügbar sein? JA
  • Wird ein Cookie für .example.com für example.com verfügbar sein? JA
  • Wird ein Cookie für example.com für www.example.com verfügbar sein? NEIN , Domain ohne Platzhalter stimmt nur mit sich selbst überein.
  • Wird ein Cookie für example.com für anotherexample.com verfügbar sein? NEIN
  • Kann www.example.com Cookies für example.com setzen? NEIN , es kann ein Cookie für '.example.com' gesetzt werden, nicht jedoch für 'example.com'.
  • Kann www.example.com ein Cookie für www2.example.com setzen? NEIN . Es kann jedoch ein Cookie für .example.com gesetzt werden, auf das www2.example.com zugreifen kann.
  • Kann www.example.com Cookies für .com setzen? NEIN
Xiaoke
quelle
3

Es ist bekannt, dass die RFCs nicht die Realität widerspiegeln.

Überprüfen Sie besser Draft-Ietf-httpstate-Cookie , in Arbeit.

Julian Reschke
quelle
3

Es gibt Regeln, die bestimmen, ob ein Browser den Set-Header-Antwortheader (serverseitiges Cookie-Schreiben) akzeptiert, eine etwas andere Regel / Interpretation für das Cookie-Set mit Javascript (ich habe VBScript nicht getestet).

Dann gibt es Regeln, die bestimmen, ob der Browser zusammen mit der Seitenanforderung ein Cookie sendet.

Es gibt Unterschiede zwischen den wichtigsten Browser-Engines, wie Domänenübereinstimmungen behandelt werden und wie Parameter in Pfadwerten interpretiert werden. Einige empirische Belege finden Sie im Artikel Wie verschiedene Browser Cookies unterschiedlich behandeln

Gert-Jan Strik
quelle
2

Ich war überrascht, Abschnitt 3.3.2 über das Ablehnen von Cookies zu lesen:

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

Das heißt, dass ein Browser ein Cookie von xyzcom mit der Domain .z.com ablehnen sollte, da 'xy' einen Punkt enthält. Sofern ich den RFC und / oder die obigen Fragen nicht falsch interpretiere, können folgende Fragen hinzugefügt werden:

Wird ein Cookie für .example.com für www.yyy.example.com verfügbar sein? Nein.

Wird ein Cookie, das vom Ursprungsserver www.yyy.example.com mit der Domain .example.com gesetzt wurde, vom Benutzeragenten an xxx.example.com gesendet? Nein.

user100034
quelle
2
dass rfc veraltet ist. Das neue RFC 6265, basierend auf dem Browserkonsens, ermöglicht das Anwenden von Cookies z.comauf z.comund alle Subdomains.
ZhongYu
1

Kann www.example.comein Cookie gesetzt werden .com?

Nein, example.com.frkann aber möglicherweise ein Cookie für setzen example2.com.fr. Firefox schützt davor, indem es eine Liste von TLDs führt: http://securitylabs.websense.com/content/Blogs/3108.aspx

Anscheinend erlaubt Internet Explorer Domains mit zwei Buchstaben nicht, Cookies zu setzen, was vermutlich erklärt, warum o2.ieeinfach umgeleitet wird o2online.ie. Das hatte ich mich oft gefragt.

TRiG
quelle
"com.fr" wird als "öffentliches Suffix" konwn. Die Cookie-Domain darf kein öffentliches Suffix sein. siehe rfc 6265 und publicsuffix.org
ZhongYu
Ja, es gibt eine Lösung, aber sie ist äußerst chaotisch. Diese Art der Kennzeichnung sollte in das DNS eingebrannt werden und nicht separat ad hoc erfolgen.
TRiG
Stimmt, und vielleicht beziehen Sie sich auf "dbound". Dies kann jedoch zu weiteren Problemen führen. eine Herausforderung für http-Client-Implementierungen darstellen.
ZhongYu
Es wäre nützlich, wenn diese Informationen in irgendeiner Weise vom Browser aus Javascript zugänglich gemacht würden. Andernfalls kann nicht programmgesteuert ermittelt werden, ob Sie ein Cookie auf einer bestimmten Domänenebene setzen können. Sie können diese Liste doch nicht bei jedem Anruf überprüfen!
Dtipson