无法从JS中的document.cookie访问cookie,但是浏览器显示存在cookie


79

我无法从JavaScript访问任何cookie。我需要读取一些值并通过JSON发送它们以进行自定义检查。

我试图从JS访问cookie,就像在下面描述的那样:

正如您在代码中看到的那样,下一个看起来像水晶一样清晰:

var c_value = document.cookie;

当我尝试document.cookie从Chrome的网络调试器访问值时,我在Watch表达式中仅看到空字符串:

因此,我无法读取所需的Cookie值。

我已经检查过要发送的Cookie名称,以获得正确的关联值。另外,如果您感兴趣的话,我正在使用W3Schools源代码获取cookie(但是从第二个链接来看,该技术是相似的)。

我该如何解决我的问题?


1
@PeeHaa真的吗?我不知道。我正在ASP.NET MVC 4(Razor)项目下工作,并且不知道默认情况下启用此参数是否支持。不要生我的气:)我是网络开发的新手。

2
在您的浏览器中检查cookie,并说出它是否仅为http。
PeeHaa

1
@PeeHaa我已经检查过了,如果Chrome的webtools中的cookie查看器表中的HTTP列中有检查,那么这是否意味着我的cookie仅是HTTP?如果是,那么我的项目仅使用HTTP cookie,并且我不知道如何解决我的问题:(

1
@PeeHaa是的,我确实有这样的控件。Cookie是通过服务器端响应设置的。我在ASP.NET MVC4项目中使用C#。我正在设置Cookie的部分:ideone.com/fBqtke

1
@PeeHaa所以,您有什么建议,如何解决?我现在正在谷歌搜索。所有网站建议使用document.cookie,Chrome的网络工具会在Http列下显示我的所有cookie和支票。为什么无法从中访问它document.cookie

Answers:


129

您最有可能处理httponlyCookie。httponly是您可以在cookie上设置的标志,表示它们无法被JavaScript访问。这是为了防止恶意脚本窃取包含敏感数据甚至整个会话的Cookie。

因此,您必须禁用该httponly标志,或者需要找到另一种方法来将数据获取到javascript中。

通过查看代码,可以很容易地禁用仅http标志:

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 });

现在,您应该能够从JavaScript访问cookie信息。但是我不知道您要获取哪种数据,因此也许您可以采用另一种方法,例如在页面上使用所需的信息呈现一些data属性,而不是尝试读取cookie:

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

console.log(document.getElementById('example').getAttribute('data-info'));

也!顺便说一句,我发现了一些信息,即HttpOnly并没有真正保护好并且可能未设置。你怎么看待这件事?

httponly不是Silverbullet。但是它将保护您免受特定类型的攻击。owasp.org/index.php/HttpOnly
PeeHaa

3

我想说的只是http是您的第一个罪魁祸首,但这也可能是由于未设置cookie的范围而引起的。

如果站点已从另一个域重定向,则需要研究设置cookie的范围。域和路径定义了cookie的范围,即cookie应该发送到的URL。取决于此,您可能不会在响应中看到cookie。

在成功的SAML SSO登录上设置cookie并无法从文档中检索cookie时,我遇到了这个问题,因为它从未作为请求的一部分发送。


3

请注意cookie的Path属性,因为cookie仅对Path下的子目录可见。我遇到了您的问题,并且解决了设置路径“ /”的问题


1

我有几次相同的问题。每次,都是出于不同的原因。

不同的原因:

  • httpOnly领域问题。它设置为false,我试图从控制台访问它。将其设置为true或从源代码访问即可达到目的。
  • secure领域问题。是的true,我只使用http。
  • 的问题Expires / Max-Age。Cookie已过时,在中不可见document.cookie


0

如果您使用某种安全身份验证,那么由于安全原因,您将无法直接访问Cookie。您必须使用以下代码在服务器端更改一些响应属性。

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 });

但是您不应该这样做,因为它可能会从安全更改为不安全,因此您必须找出在服务器端完成的解决方案以删除Cookie,并允许您执行一些操作。

可以在服务器端进行更改。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.