Mir muss etwas Grundlegendes über Cookies fehlen. Auf localhost, wenn ich auf der Serverseite ein Cookie setze und die Domäne explizit als localhost (oder .localhost) spezifiziere. Das Cookie scheint von einigen Browsern nicht akzeptiert zu werden.
Firefox 3.5: Ich habe die HTTP-Anfrage in Firebug überprüft. Was ich sehe ist:
Set-Cookie:
name=value;
domain=localhost;
expires=Thu, 16-Jul-2009 21:25:05 GMT;
path=/
oder (wenn ich die Domain auf .localhost setze):
Set-Cookie:
name=value;
domain=.localhost;
expires=Thu, 16-Jul-2009 21:25:05 GMT;
path=/
In beiden Fällen wird das Cookie nicht gespeichert.
IE8: Ich habe kein zusätzliches Tool verwendet, aber das Cookie scheint nicht ebenfalls gespeichert zu sein, da es bei nachfolgenden Anforderungen nicht zurückgesendet wird.
Opera 9.64: Sowohl localhost als auch .localhost funktionieren , aber wenn ich die Liste der Cookies in den Einstellungen überprüfe, wird die Domäne auf localhost.local festgelegt, obwohl sie unter localhost (in der Listengruppierung) aufgeführt ist.
Safari 4: Sowohl localhost als auch .localhost funktionieren , werden jedoch in den Einstellungen immer als .localhost aufgeführt. Auf der anderen Seite ein Cookie ohne explizite Domain, das nur als localhost (kein Punkt) angezeigt wird.
Was ist das Problem mit localhost? Aufgrund einer solchen Anzahl von Inkonsistenzen müssen einige spezielle Regeln für localhost gelten. Außerdem ist mir nicht ganz klar, warum Domains ein Punkt vorangestellt werden muss. In RFC 2109 heißt es ausdrücklich:
Der Wert für das Domain-Attribut enthält keine eingebetteten Punkte oder beginnt nicht mit einem Punkt.
Warum? Das Dokument zeigt an, dass es etwas mit Sicherheit zu tun hat. Ich muss zugeben, dass ich nicht die gesamte Spezifikation gelesen habe (kann es später tun), aber es klingt ein bisschen seltsam. Auf dieser Grundlage wäre es unmöglich, Cookies auf localhost zu setzen.
Antworten:
Domain-Namen müssen standardmäßig mindestens zwei Punkte haben. Andernfalls betrachtet der Browser sie als ungültig. (Siehe Referenz unter http://curl.haxx.se/rfc/cookie_spec.html )
Bei der Arbeit
localhost
muss die Cookie-Domain vollständig weggelassen werden. Es reicht nicht aus , es nur auf""
oderNULL
oderFALSE
anstelle von"localhost"
einzustellen.Informationen zu PHP finden Sie in den Kommentaren unter http://php.net/manual/en/function.setcookie.php#73107 .
Wenn Sie mit der Java-Servlet-API arbeiten, rufen Sie die
cookie.setDomain("...")
Methode überhaupt nicht auf.quelle
Domain=
Parameter beim Setzen des Cookies komplett weglassen . Wenn Sie die Domäne nur auf null oder leer setzen, sendet Ihr Framework möglicherweise denDomain=
Parameter mit diesem Wert, anstatt ihn wegzulassen. Überprüfen Sie mit zB Firebug.((domain && domain !== "localhost") ? ";domain="+domain : "")
Ich stimme @Ralph Buchfelder im Großen und Ganzen zu, aber hier ist eine Verstärkung davon durch Experimente, wenn versucht wird, ein System mit mehreren Subdomänen (wie example.com, fr.example.com, de.example.com) auf meinem lokalen Computer zu replizieren ( OS X / Apache / Chrome | Firefox).
Ich habe / etc / hosts bearbeitet, um einige imaginäre Subdomains auf 127.0.0.1 zu verweisen:
Wenn ich an fr.localexample.com arbeite und den Domain-Parameter weglasse, wird das Cookie für fr.localexample.com korrekt gespeichert, ist aber in den anderen Subdomains nicht sichtbar.
Wenn ich eine Domain von ".localexample.com" verwende, wird das Cookie für fr.localexample.com korrekt gespeichert und ist in anderen Subdomains sichtbar.
Wenn ich eine Domain von "localexample.com" verwende oder wenn ich eine Domain von "localexample" oder "localhost" versuche, wird das Cookie nicht gespeichert.
Wenn ich eine Domain von "fr.localexample.com" oder ".fr.localexample.com" verwende, wird das Cookie für fr.localexample.com korrekt gespeichert und ist in anderen Subdomains (korrekt) unsichtbar.
Die Anforderung, dass Sie mindestens zwei Punkte in der Domäne benötigen, scheint also korrekt zu sein, obwohl ich nicht verstehen kann, warum dies der Fall sein sollte.
Wenn jemand dies ausprobieren möchte, ist hier ein nützlicher Code:
quelle
localhost: Sie können verwenden:
domain: ".app.localhost"
und es wird funktionieren. Der Parameter 'domain' benötigt 1 oder mehr Punkte im Domainnamen, um Cookies zu setzen. Anschließend können Sitzungen in lokalen Host-Subdomänen ausgeführt werden, zapi.app.localhost:3000
.quelle
express.session({cookie: { domain: '.app.localhost', maxAge: 24 * 60 * 60 * 1000 }})
.app.
Kommens? Ist es Teil einer SPEC? Und gilt es für alle nicht konformen Domänen (diejenigen ohne zwei Punkte)? Funktioniert dies auch mit alten Browsern? : ^)Wenn ein Cookie mit der expliziten Domäne 'localhost' wie folgt gesetzt wird ...
... dann ignorieren Browser es, weil es nicht mindestens zwei Punkte enthält und keine von sieben speziell behandelten Top-Level-Domains ist .
Beachten Sie, dass die Anzahl der oben genannten Perioden wahrscheinlich davon ausgeht, dass eine führende Periode erforderlich ist. Dieser Zeitraum wird jedoch in modernen Browsern ignoriert und sollte wahrscheinlich ...
Beachten Sie, dass der Standardwert für das Domänenattribut der Hostname des Servers ist, der die Cookie-Antwort generiert hat .
So eine Abhilfe für Cookies für localhost nicht gesetzt sind , ist einfach kein Domain - Attribut angeben und der Browser den Standardwert verwenden lassen - dies scheint nicht die gleichen Einschränkungen zu haben , dass ein expliziter Wert in dem Domäne - Attribute.
quelle
Ergebnisse hatte ich je nach Browser variiert.
Chrome-127.0.0.1 funktionierte, localhost .localhost und "" jedoch nicht. Firefox- .localhost funktionierte, localhost 127.0.0.1 und "" jedoch nicht.
Habe nicht in Opera, IE oder Safari getestet
quelle
Domain=
Parameters funktioniert.Domain=
funktioniert auch, funktioniert aberDomain=localhost
nicht.Ich habe viel Zeit damit verbracht, dieses Problem selbst zu beheben.
Die Verwendung von PHP und Nothing auf dieser Seite hat bei mir funktioniert. In meinem Code wurde mir schließlich klar, dass der 'sichere' Parameter für PHPs session_set_cookie_params () immer auf TRUE gesetzt wurde.
Da ich localhost nicht mit https besuchte, akzeptierte mein Browser das Cookie niemals. Also habe ich diesen Teil meines Codes geändert, um den 'sicheren' Parameter basierend darauf festzulegen, dass $ _SERVER ['HTTP_HOST'] 'localhost' ist oder nicht. Funktioniert jetzt gut.
Ich hoffe das hilft jemandem.
quelle
Wenn Sie ein Cookie aus einer anderen Domäne setzen (dh Sie setzen das Cookie, indem Sie eine XHR-Cross-Origin-Anfrage stellen), müssen Sie sicherstellen, dass Sie das
withCredentials
Attribut in der XMLHttpRequest, mit der Sie das Cookie abrufen, wie hier beschrieben, auf true setzenquelle
Sie können verwenden
localhost.org
oder vielmehr wird.localhost.org
es immer zu lösen127.0.0.1
quelle
Ich hatte viel mehr Glück beim lokalen Testen mit 127.0.0.1 als Domain. Ich bin mir nicht sicher warum, aber ich hatte gemischte Ergebnisse mit localhost und .localhost usw.
quelle
Keine der vorgeschlagenen Korrekturen hat bei mir funktioniert - Setzen auf Null, Falsch, Hinzufügen von zwei Punkten usw. - hat nicht funktioniert.
Am Ende habe ich gerade die Domain aus dem Cookie entfernt, wenn es sich um localhost handelt, und das funktioniert jetzt in Chrome 38 für mich .
Vorheriger Code (hat nicht funktioniert):
Neuer Code (funktioniert jetzt):
quelle
Ich hatte das gleiche Problem und habe es behoben, indem ich 2 Punkte in den Cookie-Namen selbst eingefügt habe, ohne eine Domain anzugeben.
quelle
Es scheint ein Problem zu geben, wenn Sie
https://<local-domain>
und dann verwendenhttp://<local-domain>
. Diehttp://
Site sendet keine Cookies mit Anfragen, nachdem diehttps://
Site diese gesetzt hat. Das Neuladen erzwingen und den Cache leeren hilft nicht. Nur das manuelle Löschen von Cookies funktioniert. Wenn ich sie auf der Seite lösche, funktioniert diehttps://
Seitehttp://
wieder.Scheint mit "Strict Secure Cookies" verwandt zu sein. Gute Erklärung hier . Es wurde in Chrome 58 am 2017-04-19 veröffentlicht.
Es sieht so aus, als würde Chrome tatsächlich sowohl sichere als auch nicht sichere Cookies aufzeichnen, da beim Klicken auf das Adressleistensymbol je nach Protokoll der Seite die richtigen Cookies angezeigt werden.
Es
Developer tools > Application > Cookies
wird jedoch kein nicht sicheres Cookie angezeigt, wenn es ein sicheres Cookie mit demselben Namen für dieselbe Domain gibt, und es wird auch kein nicht sicheres Cookie mit Anfragen gesendet. Dies scheint ein Chrome-Fehler zu sein. Wenn dieses Verhalten erwartet wird, sollte es eine Möglichkeit geben, die sicheren Cookies auf einerhttp
Seite anzuzeigen und anzuzeigen , dass sie überschrieben werden.Problemumgehung: Verwenden Sie Cookies mit unterschiedlichen Namen, je nachdem, ob sie für eine http- oder eine https-Site bestimmt sind, und benennen Sie sie spezifisch für Ihre App. Ein
__Secure-
Präfix gibt an, dass das Cookie streng sicher sein sollte, und ist auch eine gute Vorgehensweise, da sicher und nicht sicher nicht kollidieren. Es gibt andere Vorteile auch zu Präfixe.Die Verwendung unterschiedlicher
/etc/hosts
Domänen für den Zugriff auf https und http würde ebenfalls funktionieren, aber ein versehentlicherhttps://localhost
Besuch verhindert, dass Cookies mit demselben Namen aufhttp://localhost
Websites funktionieren. Dies ist also keine gute Problemumgehung.Ich habe eine eingereicht Chrome-Fehlerbericht .
quelle
document.cookie = Wertname + "=" + Wert + ";" + läuft ab + "; domain =; path = /";
diese "domain =; path = /"; nimmt eine dynamische Domain an, da das Cookie in der Subdomain funktioniert. Wenn Sie in localhost testen möchten, wird es funktionieren
quelle
Keine der Antworten hier hat bei mir funktioniert. Ich habe es behoben, indem ich mein PHP als erstes auf die Seite gesetzt habe.
Wie bei anderen Headern müssen Cookies vor jeder Ausgabe Ihres Skripts gesendet werden (dies ist eine Protokollbeschränkung). Dies erfordert, dass Sie diese Funktion vor jeder Ausgabe aufrufen, einschließlich und Tags sowie vor Leerzeichen.
Von http://php.net/manual/en/function.setcookie.php
quelle
Auf Chromium ist seit 2011 ein Problem aufgetreten. Wenn Sie die Domäne explizit als "localhost" festlegen, sollten Sie sie als
false
oder festlegenundefined
.quelle
Ich habe ein bisschen rumgespielt.
funktioniert ab heute in Firefox und Chrome. Ich habe jedoch keinen Weg gefunden, es mit Curl zum Laufen zu bringen. Ich habe Host-Header ausprobiert und --resolve, kein Glück, jede Hilfe geschätzt.
Es funktioniert jedoch in Curl, wenn ich es auf setze
stattdessen. (Was mit Firefox nicht funktioniert.)
quelle
Ein weiteres wichtiges Detail, das expires = sollte das folgende Datums- / Uhrzeitformat verwenden: Wdy, TT-Mo-JJJJ HH: MM: SS GMT ( RFC6265 - Abschnitt 4.1.1 ).
quelle
Nach vielem Experimentieren und Lesen verschiedener Beiträge funktionierte dies. Ich könnte mehrere Cookies setzen, sie zurücklesen und die Zeit negativ einstellen und sie löschen.
quelle
Das einzige, was für mich funktioniert hat, war,
Path=/
den Cookie zu setzen.Darüber hinaus scheint sich der Standardwert eines Pfadattributs von Browser zu Browser zu unterscheiden, obwohl ich nur zwei davon getestet habe (Firefox und Chrome).
Chrome versucht, ein Cookie so zu setzen, wie es ist. Wenn das
path
Attribut imSet-Cookie
Header weggelassen wird, wird es nicht gespeichert und ignoriert.Firefox speichert jedoch ein Cookie auch ohne explizites
path
Attribut. Es wird nur der angeforderte Pfad festgelegt. Meine Anforderungs-URL war/api/v1/users
und der Pfad wurde/api/v1
automatisch festgelegt.Wie auch immer, beide Browser funktionierten, wenn
path
sie/
auch ohne explizite Domain eingestellt waren, dhDomain=localhost
oder so. Es gibt also einige Unterschiede in der Art und Weise, wie jeder Browser mit Cookies umgeht.quelle