检查Javascript中是否存在httponly cookie

42

正如问题所说,如果HttpOnly存在,你可以在JavaScript中找到cookie吗? 我不需要访问其中的信息,只需知道它是否存在。

更多情况说明是最初使用Cookie作为身份验证令牌的Web服务器,因为客户端没有使用它,所以将其设置为httponly,从而增加了安全性。

但是现在需要进行更改,客户端需要知道它是否拥有cookie(因为站点可以在用户未登录的情况下工作,但是如果他们已登录(auth cookie存在),站点需要显示某些内容并隐藏其他内容)。

在Web服务器上还有其他安全预防措施,因此在客户端具有不正确的auth cookie的情况下不会造成任何伤害,但是站点的操作看起来像他们已登录,它将删除cookie并拒绝用户。


1
你能否不更改服务器端代码,在页面创建的过程中将认证状态传递给客户端进行通信? - Neil
1
实际上,这个网站没有服务器端代码,它是一个纯粹的HTML/JavaScript网站,还允许用户登录以在localStorage之外保存信息(这就是Web服务器发挥作用的地方)。最初,客户端需要在访问网站之前进行登录,但现在用户可以使用整个网站而无需使用localStorage进行登录。这个调用是为了检查cookie是否存在,以决定是否显示登录框以及其他远程功能是否已登录。 - Grofit
4个回答

53

您可以通过使用 JavaScript 尝试将其设置为值来间接检查它是否存在,如果无法设置,则必须存在 HTTP Only Cookie(或用户正在阻止 cookie)。

function doesHttpOnlyCookieExist(cookiename) {
  var d = new Date();
  d.setTime(d.getTime() + (1000));
  var expires = "expires=" + d.toUTCString();

  document.cookie = cookiename + "=new_value;path=/;" + expires;
  return document.cookie.indexOf(cookiename + '=') == -1;
}

3
请问您能否说明在Firefox上哪一部分无法正常工作?我使用的是66.0.3版本,它似乎完全正常地运行着……得到了与Chrome、Edge和IE11相同的结果。 - Mathijs Flietstra
Safari 13 覆盖 cookie。 - vitaliytv
6
我认为你不应该依赖这个解决方案,因为它是一项实现细节。也许在未来,主流浏览器会认为这是一个安全漏洞,并允许两个同名的 Cookie 共存。这很可能会发生,因为浏览器已经提供了这个功能。 - Charming Robot
1
这个在iOS 14上似乎不再起作用了。我尝试在iPad和iPhone的Chrome和Safari上使用iOS 14.x,但它们都无法工作。 - Nghia Le
嗨,关于IOS的问题,有没有更新或替代方案?它在IOS上无法工作。 - Surendra
显示剩余3条评论

53

我遇到了同样的问题。我通过服务器设置另一个cookie来解决它,而不是httpOnly,每次刷新httpOnly会话cookie时都会设置相同的max-age和不敏感数据。现在,如果其中一个存在,另一个也是如此,客户端就可以知道是否存在httpOnly对应项。


5
在我看来,这是最好的答案。这也有助于情况,在用户突然清除了他在特定网站上的所有cookie时。 - Algorini
3
这是最好的答案。选择的答案是一个打补丁的方法,会带来新的问题。 - burnedfaceless

12

每当你需要检查cookie是否存在时,你可以向需要身份验证的服务器发送请求并检查响应。如果响应是401 Unauthorized403 Forbidden之类的内容,则该cookie可能不存在,此时你可以提示用户进行登录。

另一方面,如果该cookie存在,浏览器会自动发送它,并返回200 OK响应。


12

不可以。请看下面Rob的评论。

请看这个链接,也许您已经看过了 - http://en.wikipedia.org/wiki/HTTP_cookie#Secure_and_HttpOnly

HttpOnly cookie不能通过非HTTP方法进行访问,例如使用JavaScript进行调用(例如引用“document.cookie”)...

编辑:删除了undefined响应,我写了一个脚本,您可能没有使用 :)


它将返回“undefined”?Cookie是通过document.cookie获取的,这是一个始终存在的字符串。HttpOnly cookie只是不会显示出来,但它绝对不是“undefined”。 - Rob W
我的意思是如果你尝试访问它并获取返回值。对吗? - Mike
JavaScript中的Cookie必须通过对document.cookie进行字符串操作来获取。例如,document.cookie可能看起来像value=woow%20; value2=another%20woot。要查找键名为value的Cookie的值,可以使用(示例):var test = /(?:;\s*|^)?woow=([^;]*)/.exec(document.cookie);如果Cookie存在,则可以通过test[1]获取其值。如果不存在,则test === null,并尝试执行test[1]将抛出一个null错误。 - Rob W

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接