Ich kann in doc.cookie in JS nicht auf Cookies zugreifen, aber der Browser zeigt an, dass Cookies vorhanden sind

79

Ich kann über JavaScript nicht auf Cookies zugreifen. Ich muss einen Wert lesen und ihn für meine benutzerdefinierten Prüfungen über JSON senden.

Ich habe versucht, auf Cookies von JS zuzugreifen, wie es beschrieben wurde unter:

Wie Sie im Code sehen können, ist es beim nächsten Mal so klar wie ein Kristall:

var c_value = document.cookie;

Wenn ich versuche, über document.cookieden Web-Debugger von Chrome auf den Wert zuzugreifen , wird in den Watch-Ausdrücken nur die leere Zeichenfolge angezeigt :

Daher kann ich den von mir benötigten Cookie-Wert nicht lesen.

Ich habe den Cookie-Namen überprüft, den ich sende, um einen zugehörigen Wert zu erhalten. Außerdem verwende ich den W3Schools- Quellcode, um Cookies zu erhalten, wenn Sie interessiert sind (aber ab dem 2. Link ist die Technik ähnlich).

Wie kann ich mein Problem beheben?

vinzee
quelle
1
@ PeeHaa Wirklich? Ich weiß es nicht. Ich arbeite unter dem ASP.NET MVC 4 (Razor) -Projekt und weiß nicht, ob es diesen Parameter standardmäßig unterstützt. Sei mir nicht böse :) Ich bin ein Neuling in der Webentwicklung.
2
Überprüfen Sie das Cookie in Ihrem Browser und es sollte angezeigt werden, ob es nur http ist oder nicht.
PeeHaa
1
@PeeHaa Ich habe überprüft, ob in der Tabelle des Cookie-Viewers in den Webtools von Chrome eine Überprüfung der HTTP-Spalte erfolgt. Bedeutet dies, dass meine Cookies nur HTTP sind? Wenn ja, verwendet mein Projekt nur HTTP-Cookies und ich verstehe nicht, wie ich mein Problem beheben kann :(
1
@PeeHaa Ja, ich habe eine solche Kontrolle. Cookies werden durch serverseitige Antwort gesetzt. Ich verwende C # in meinem ASP.NET MVC4-Projekt. Der Teil, den ich Cookies setze
1
@PeeHaa also, hast du Vorschläge, wie man das behebt? Ich google gerade. Alle Websites empfehlen die Verwendung document.cookie. Das Chrome-Webtool zeigt alle meine Cookies und Überprüfungen in der Spalte "HTTP" an. Warum ist es nicht von der zugänglich document.cookie?

Antworten:

129

Sie haben es höchstwahrscheinlich mit httponlyCookies zu tun . httponlyist ein Flag, das Sie für Cookies setzen können, was bedeutet, dass JavaScript nicht auf sie zugreifen kann. Dies soll verhindern, dass böswillige Skripte Cookies mit vertraulichen Daten oder sogar ganze Sitzungen stehlen.

Sie müssen also entweder das httponlyFlag deaktivieren oder einen anderen Weg finden, um die Daten in Ihr Javascript zu übertragen.

Wenn Sie sich Ihren Code ansehen, sollte es einfach sein, das Nur-http-Flag zu deaktivieren:

Response.AddHeader("Set-Cookie", "CookieName=CookieValue; path=/;");
Response.SetCookie(new HttpCookie("session-id") { Value = Guid.NewGuid().ToString(), HttpOnly = false });
Response.SetCookie(new HttpCookie("user-name") { Value = data.Login, HttpOnly = false });

Jetzt sollten Sie über JavaScript auf die Cookie-Informationen zugreifen können. Ich weiß jedoch nicht genau, welche Art von Daten Sie abrufen möchten. Vielleicht können Sie stattdessen einen anderen Ansatz wählen und beispielsweise ein Datenattribut auf der Seite mit den benötigten Informationen rendern, anstatt zu versuchen, das Cookie zu lesen:

<div id="example" data-info="whatever data you are trying to retrieve"></div>

console.log(document.getElementById('example').getAttribute('data-info'));
PeeHaa
quelle
Ebenfalls! Übrigens habe ich einige Infos gefunden, die HttpOnly nicht wirklich schützt und möglicherweise nicht eingestellt ist. Was denkst du darüber?
httponly ist keine Silberkugel. Aber es schützt Sie vor bestimmten Arten von Angriffen. owasp.org/index.php/HttpOnly
PeeHaa
3

Ich würde sagen, nur http ist Ihr erster Schuldiger, aber dies kann auch passieren, wenn Sie den Umfang Ihres Cookies nicht festlegen.

Wenn die Site von einer anderen Domain umgeleitet wurde, müssen Sie den Umfang des Cookies festlegen. Domäne und Pfad definieren den Bereich des Cookies, an welche URLs das Cookie gesendet werden soll. Abhängig davon wird das Cookie möglicherweise nicht in Ihrer Antwort angezeigt.

Ich habe dieses Problem beim Setzen eines Cookies bei einer erfolgreichen SAML-SSO-Anmeldung festgestellt und konnte das Cookie nicht aus dem Dokument abrufen, da es nie als Teil der Anforderung gesendet wurde.

Tenzin Palber
quelle
3

Behalten Sie auch das Pfadattribut des Cookies im Auge, da das Cookie nur für Unterverzeichnisse unter Pfad sichtbar ist. Ich hatte Ihr Problem und habe das Einstellen des Pfads "/" gelöst.

ejaenv
quelle
1

Ich hatte mehrmals das gleiche Problem. Und jedes Mal war es aus einem anderen Grund.

Verschiedene Gründe:

  • Problem des httpOnlyFeldes. Es war auf eingestellt falseund ich habe versucht, über die Konsole darauf zuzugreifen. Es truehat den Trick gemacht, es auf den Quellcode einzustellen oder darauf zuzugreifen.
  • Problem des secureFeldes. Es war trueund ich benutzte nur http.
  • Problem von Expires / Max-Age. Der Cookie war veraltet und in war nicht sichtbar document.cookie.
vinzee
quelle
0

Wenn Sie eine sichere Authentifizierung verwenden, können Sie in diesem Fall aus Sicherheitsgründen nicht direkt auf Cookies zugreifen. Sie müssen einige Antwortattribute auf der Serverseite mithilfe des folgenden Codes ändern.

Response.AddHeader("Set-Cookie", "CookieName=CookieValue; path=/;");
Response.SetCookie(new HttpCookie("session-id") { Value = Guid.NewGuid().ToString(), HttpOnly = false });
Response.SetCookie(new HttpCookie("user-name") { Value = data.Login, HttpOnly = false });

Sie sollten dies jedoch nicht tun, da es sich möglicherweise um sicher in nicht sicher ändert. Sie müssen daher eine Lösung finden, die auf der Serverseite ausgeführt wird, um Cookies zu löschen und einige Vorgänge zuzulassen.

Es ist möglich, Änderungen auf der Serverseite vorzunehmen.

Manas
quelle