it-swarm.com.de

Sind HTTP-Cookies portspezifisch?

Ich habe zwei HTTP-Dienste auf einem Computer ausgeführt. Ich möchte nur wissen, ob sie ihre Cookies freigeben oder ob der Browser zwischen den beiden Server-Sockets unterscheidet.

315
guerda

Die aktuelle Cookie-Spezifikation ist RFC 6265 , die RFC 2109 und RFC 2965 ersetzt (beide RFCs sind jetzt als "Historisch" gekennzeichnet) und das formalisiert Syntax für die reale Verwendung von Cookies. Es heißt eindeutig:

  1. Einführung

...

Aus historischen Gründen enthalten Cookies eine Reihe von Sicherheits- und Datenschutzlücken. Beispielsweise kann ein Server angeben, dass ein bestimmtes Cookie für "sichere" Verbindungen vorgesehen ist, das Secure-Attribut bietet jedoch keine Integrität bei Vorhandensein eines aktiven Netzwerkangreifers. In ähnlicher Weise werden Cookies für einen bestimmten Host über alle Ports auf diesem Host gemeinsam genutzt, obwohl die von Webbrowsern verwendete "Same-Origin-Richtlinie" Inhalte isoliert, die über verschiedene Ports abgerufen werden.

Und auch:

8.5. Schwache Vertraulichkeit

Cookies bieten keine Isolierung nach Port . Wenn ein Cookie von einem Dienst gelesen werden kann, der an einem Port ausgeführt wird, kann das Cookie auch von einem Dienst gelesen werden, der an einem anderen Port desselben Servers ausgeführt wird. Wenn ein Cookie von einem Dienst auf einem Port geschrieben werden kann, kann das Cookie auch von einem Dienst geschrieben werden, der auf einem anderen Port desselben Servers ausgeführt wird. Aus diesem Grund DÜRFEN Server NICHT beide gegenseitig misstrauende Dienste auf verschiedenen Ports desselben Hosts ausführen und Cookies zum Speichern sicherheitsrelevanter Informationen verwenden.

291
Remy Lebeau

Gemäß RFC2965 3.3.1 (dem möglicherweise Browser folgen oder nicht), es sei denn, der Port wird explizit über den Parameter port des Headers Set-Cookie Angegeben. Cookies können an einen beliebigen Port gesendet werden oder nicht.

In Googles Browser Security Handbook heißt es: Standardmäßig ist der Cookie-Bereich auf alle URLs des aktuellen Hostnamens beschränkt - und nicht an Port- oder Protokollinformationen gebunden. und einige Zeilen später Es gibt keine Möglichkeit, Cookies nur auf einen DNS-Namen [...] zu beschränken, und es gibt keine Möglichkeit, sie auf einen bestimmten Port zu beschränken . (Beachten Sie auch, dass IE) Portnummern überhaupt nicht in die Richtlinie für denselben Ursprung einbezieht .)

Es scheint also nicht sicher zu sein, sich hier auf ein genau definiertes Verhalten zu verlassen.

125
Tgr

Dies ist eine sehr alte Frage, aber ich dachte, ich würde eine Problemumgehung hinzufügen, die ich verwendet habe.

Auf meinem Laptop werden zwei Dienste ausgeführt (einer auf Port 3000 und der andere auf 4000). Wenn ich zwischen (http://localhost:3000 und http://localhost:4000), Chrome würde dasselbe Cookie übergeben, jeder Dienst würde das Cookie nicht verstehen und ein neues generieren.

Ich habe festgestellt, dass, wenn ich auf http://localhost:3000 und http://127.0.0.1:4000, das Problem ist behoben, da Chrome ein Cookie für localhost und eines für 127.0.0.1 gespeichert hat.

An dieser Stelle mag sich nochmal niemand darum kümmern, aber es war einfach und hilfreich für meine Situation.

63
Pat

Dies ist eine große graue Fläche im Cookie SOP (Same Origin Policy).

Theoretisch können Sie die Portnummer in der Domain angeben und das Cookie wird nicht freigegeben. In der Praxis funktioniert dies mit mehreren Browsern nicht und Sie werden auf andere Probleme stoßen. Dies ist also nur möglich, wenn Ihre Websites nicht für die breite Öffentlichkeit bestimmt sind und Sie steuern können, welche Browser verwendet werden sollen.

Der bessere Ansatz besteht darin, zwei Domain-Namen für dieselbe IP-Adresse abzurufen und sich bei Cookies nicht auf Portnummern zu verlassen.

19
ZZ Coder

Eine alternative Möglichkeit, das Problem zu umgehen, besteht darin, den Namen des Sitzungscookies portbezogen zu machen. Beispielsweise:

  • mysession808 für den Server, der auf Port 8080 ausgeführt wird
  • mysession80 für den Server, der auf Port 8000 ausgeführt wird

Ihr Code könnte auf die Webserverkonfiguration zugreifen, um herauszufinden, welchen Port Ihr Server verwendet, und das Cookie entsprechend benennen.

Denken Sie daran, dass Ihre Anwendung beide Cookies erhält und Sie denjenigen anfordern müssen, der Ihrem Port entspricht.

Es ist nicht erforderlich, die genaue Portnummer im Cookie-Namen anzugeben, dies ist jedoch praktischer.

Im Allgemeinen kann der Cookie-Name jeden anderen Parameter codieren, der für die von Ihnen verwendete Serverinstanz spezifisch ist, sodass er durch den richtigen Kontext decodiert werden kann.

16

In IE 8) werden Cookies (nur gegen localhost überprüft) zwischen den Ports geteilt, in FF 10 nicht.

Ich habe diese Antwort gepostet, damit die Leser mindestens eine konkrete Option zum Testen jedes Szenarios haben.

9
Jeb

Ich hatte ein ähnliches Problem beim Ausführen (und beim Debuggen) von zwei verschiedenen Django Anwendungen auf demselben Computer.

Ich habe sie mit folgenden Befehlen ausgeführt:

./manage.py runserver 8000
./manage.py runserver 8001

Wenn ich mich beim ersten und dann beim zweiten angemeldet habe, habe ich mich immer beim ersten und umgekehrt abgemeldet.

Ich habe dies auf meinem / etc/hosts hinzugefügt

127.0.0.1    app1
127.0.0.1    app2

Dann habe ich die beiden Apps mit diesen Befehlen gestartet:

./manage.py runserver app1:8000
./manage.py runserver app2:8001

Problem gelöst :)

3
Andrea Grandi

Es ist freiwillig.

Der Port kann angegeben werden, damit Cookies portspezifisch sein können. Es ist nicht notwendig, der Webserver/die Anwendung muss sich darum kümmern.

Quelle: deutscher Wikipedia-Artikel , RFC2109 , Kapitel 4.3.1

1
guerda