检查Javascript中是否存在httponly cookie

检查Javascript中是否存在httponly cookie,javascript,cookies,httponly,Javascript,Cookies,Httponly,正如问题所说,如果cookie是HttpOnly,那么您能找出它是否存在于Javascript中吗?我不需要访问其中的信息,只要知道它有一个 关于这种情况的更多信息是,最初有一个web服务器使用cookie作为身份验证令牌,它被设置为httponly,因为客户端没有使用它,所以它添加到了安全性中 但是现在需要进行更改,客户机需要知道它是否有cookie(因为站点可以在用户未登录的情况下工作,但是如果用户已登录(auth cookie将存在),则站点需要显示某些内容并隐藏其他内容 web服务器上还

正如问题所说,如果cookie是HttpOnly,那么您能找出它是否存在于Javascript中吗?我不需要访问其中的信息,只要知道它有一个

关于这种情况的更多信息是,最初有一个web服务器使用cookie作为身份验证令牌,它被设置为httponly,因为客户端没有使用它,所以它添加到了安全性中

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


web服务器上还有其他安全预防措施,因此在客户端具有不正确的身份验证cookie的情况下不会有任何危害,但网站会使其看起来像他们已登录,因为这样会删除cookie并拒绝用户。

否。请参阅下面Rob的评论

看这个,你可能已经看到了-

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


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

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

函数doesHttpOnlyCookieExist(cookiename){
var d=新日期();
d、 setTime(d.getTime()+(1000));
var expires=“expires=“+d.toutString();
document.cookie=cookiename+“=新的_值;path=/;”+过期;
if(document.cookie.indexOf(cookiename+'=')=-1){
返回true;
}否则{
返回false;
}
}

每当需要检查cookie是否存在时,可以向需要验证的服务器发送请求并检查响应。如果类似于
401未授权
403禁止
,那么cookie可能不存在&您可以提示用户登录


另一方面,如果cookie存在,浏览器会自动发送cookie,导致
200 OK
响应。

我也有同样的问题。我通过服务器设置另一个cookie(而不是httponly)解决了这个问题,每次它刷新httponly会话cookie时,都使用相同的最大年龄,并且没有敏感数据。现在,如果其中一个存在,另一个也存在,客户端可以知道是否存在httponly对应项。

“它将返回
未定义的
”?cookie是通过
document.cookie
获取的,它是一个始终存在的字符串。HttpOnly cookie不会出现,但它肯定不是“
未定义的”
”,我的意思是如果您尝试访问它并获取返回值。对吗?JavaScript中的cookie必须通过
document.cookie
上的字符串操作来获取。例如,
document.cookie
可以看起来像
value=woow%20;值2=另一个%20woot
。要查找键名为
value
的cookie的值,可以使用(示例):
var test=/(?:;\s*|^)?woow=([^;]*)/.exec(document.cookie)
如果cookie存在,您可以通过
test[1]
获取值。如果它没有
test===null
,并且尝试执行
test[1]
将抛出一个
null
错误。作为页面创建的一部分,您不能更改服务器端代码以将身份验证状态传达给客户端吗?实际上没有服务器端代码,它是一个纯html/javascript网站,还允许用户登录以在localStorage之外保存信息(这就是web服务器的作用)。最初,客户端需要在访问站点之前登录,但是现在用户可以使用整个站点,而无需使用localStorage登录。这个查询cookie是否存在的调用将显示登录框,以及其他远程功能(如果它们已登录)。您介意解释一下这其中的哪一部分在Firefox上不起作用吗?我在这里使用66.0.3,它似乎工作得非常好。。。获得了与Chrome、Edge和IE11完全相同的结果。Safari 13刚刚在macOS Catalina上的Safari 13.1、Firefox 76.0.1和Chrome 83上进行了测试。在所有3个上都很有魅力,谢谢你的精彩表演!:达格利德和阿里……这是个绝妙的把戏。我怀疑它在将来的某个时候会被“修复”,但现在,这也是我要做的…在我看来,你不应该依赖这个解决方案,因为它是一个实现细节。也许在未来,主要浏览器会认为这是一个安全漏洞,反过来又允许两个cookies共存共享相同的名称。这很可能发生,因为浏览器已经提供了这个功能。在我看来,这是最好的答案。这也有助于防止用户突然清除特定站点上的所有cookie。