Sind HTTP-Cookies portspezifisch?

355

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

Guerda
quelle

Antworten:

329

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

  1. Einführung

...

Aus historischen Gründen enthalten Cookies eine Reihe von Sicherheits- und Datenschutzproblemen. Ein Server kann beispielsweise angeben, dass ein bestimmtes Cookie für "sichere" Verbindungen vorgesehen ist, das Attribut "Sicher" jedoch bei Vorhandensein eines aktiven Netzwerkangreifers keine Integrität bietet. In ähnlicher Weise werden Cookies für einen bestimmten Host von allen Ports auf diesem Host gemeinsam genutzt, obwohl die übliche "Richtlinie gleichen Ursprungs", die von Webbrowsern verwendet wird, 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 auf einem Port ausgeführt wird, kann das Cookie auch von einem Dienst gelesen werden, der auf einem anderen Port desselben Servers ausgeführt wird. Wenn ein Cookie von einem Dienst an 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 sollten Server NICHT beide gegenseitig misstrauische Dienste an verschiedenen Ports desselben Hosts ausführen und Cookies zum Speichern sicherheitsrelevanter Informationen verwenden.

Remy Lebeau
quelle
129

Gemäß RFC2965 3.3.1 (dem möglicherweise Browser folgen oder nicht) werden Cookies möglicherweise an keinen Port gesendet , sofern der Port nicht explizit über den portParameter des Set-CookieHeaders angegeben wird.

Im Browser-Sicherheitshandbuch von Google 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 einzigen DNS-Namen zu beschränken, [...] ebenso wie es keine Möglichkeit gibt, sie auf einen bestimmten Port zu beschränken. (Auch im Auge behalten, dass der IE nicht Faktor Portnummern in die Same Origin Policy überhaupt .)

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

Tgr
quelle
75
RFC 6265 , das RFC 2965 ersetzt, eliminiert den PortParameter im Set-CookieHeader (da ihn in der Praxis fast niemand verwendet hat) und macht deutlich, dass Cookies auf demselben Host NICHT mehr durch Ports unterscheidbar sind.
Remy Lebeau
5
IE 9 sendet das Cookie bei nachfolgenden Anforderungen nicht einmal zurück, wenn die Domain einen Port enthält
axk
3
Gibt es einen Browser, der noch einen Port in der SOP seiner Cookies berücksichtigt?
Bertuz
5
Chrome setzt das Cookie nicht einmal, wenn die Domain einen Port enthält.
Pim Heijden
76

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

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

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

Auch hier mag es niemanden interessieren, aber es war einfach und hilfreich für meine Situation.

Klopfen
quelle
1
Ja, da Cookies mit Host- / Domain-Namen verknüpft sind, kann ein Cookie localhostnicht mit geteilt werden 127.0.0.1und umgekehrt. Cookies auf demselben Host / derselben Domain können jedoch unabhängig vom Port gemeinsam genutzt werden.
Remy Lebeau
3
Natürlich tun sie das. Ich (und wahrscheinlich Millionen andere Entwickler) verwenden localhost ständig zum Testen. Es sei denn, der hinzugefügte Port macht einen Unterschied: localhost: 8080
David Balažic
53
Sie können auch 127.0.0.1, 127.0.0.2, 127.0.0.3 usw. verwenden. Alle bedeuten localhost.
David Balažic
3
Ich kann das nicht positiv bewerten, weil es die Frage nicht beantwortet, aber das ist ein großartiger Tipp, danke!
Martin T.
2
Wenn Sie bereit sind, Ihre Hosts-Datei (/ etc / hosts unter Unix) zu bearbeiten, können Sie für localhost so viele aussagekräftige Namen haben, wie Sie möchten.
Silas S. Brown
20

Dies ist eine große Grauzone in der Cookie-SOP (Same Origin Policy).

Theoretisch können Sie die Portnummer in der Domäne angeben, und das Cookie wird nicht freigegeben. In der Praxis funktioniert dies nicht mit mehreren Browsern, 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 Domainnamen für dieselbe IP zu erhalten und sich bei Cookies nicht auf Portnummern zu verlassen.

ZZ Coder
quelle
9
Es ist keine Grauzone mehr. RFC 6265 , der derzeitige Cookie-Standard, beseitigt jegliche Verwirrung, indem einfach die Möglichkeit beseitigt wird, Cookies auf demselben Host über verschiedene Ports zu trennen.
Remy Lebeau
18

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

  • mysession8080 für den Server, der auf Port 8080 ausgeführt wird
  • mysession8000 für den Server, der auf Port 8000 ausgeführt wird

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

Beachten Sie, dass Ihre Anwendung beide Cookies erhält und Sie das Cookie anfordern müssen, das Ihrem Port entspricht.

Es ist nicht erforderlich, die genaue Portnummer im Cookie-Namen zu haben, dies ist jedoch bequemer.

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 dekodiert werden kann.

Manolis M. Tsangaris
quelle
9

In IE 8 werden Cookies (nur anhand von localhost überprüft) von Ports gemeinsam genutzt. In FF 10 sind sie nicht.

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

Jeb
quelle
4

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, wurde ich immer beim ersten und umgekehrt abgemeldet.

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

127.0.0.1    app1
127.0.0.1    app2

Dann habe ich die beiden Apps mit folgenden Befehlen gestartet:

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

Problem gelöst :)

Andrea Grandi
quelle
4
Sie können wahrscheinlich 127.0.0.1:8000für eine, localhost:8000für eine Sekunde und möglicherweise ::1:8000(vielleicht [::1]:8080) für eine dritte verwenden, ohne jemals die Hosts-Datei berühren zu müssen.
Travis Watson
1
Sie können es in eine Zeile setzen:::1 app1 app2 app3 app4 app5 appN
Aeroson