如何使用 JavaScript 读取 HttpOnly cookie
Posted
技术标签:
【中文标题】如何使用 JavaScript 读取 HttpOnly cookie【英文标题】:How to read a HttpOnly cookie using JavaScript 【发布时间】:2011-12-25 05:53:50 【问题描述】:编辑
“安全 cookie”的含义并不明确。澄清一下:
与通过 https:// 协议发送时一样安全 - 即。 cookie不以明文形式发送。被称为“安全标志”
在 cookie 中运行的 javascript 无法读取安全
浏览器——即。
document.cookie
将不起作用。称为“HttpOnly”标志。
此编辑是为了澄清最初的问题是关于第二种情况。
原始问题
有什么方法可以使用 JavaScript 读取安全 cookie?
我尝试使用document.cookie
进行此操作,据我在this article about secure cookies and HttpOnly flag 上看到的,我无法以这种方式访问安全cookie。
任何人都可以提出解决方法吗?
【问题讨论】:
来自wiki:安全cookie仅在浏览器通过HTTPS访问服务器时使用。 @Pavel Hodek 这是错误的标志。 “安全”cookie 标志与 HTTPOnly 安全标志无关。他们有一个糟糕的命名系统。 这个问题的标题应该更改为包含“HttpOnly”标志。就目前而言,问题似乎与“安全”标志有关。 【参考方案1】:设置了不同的浏览器enable different security measures when the HTTPOnly 标志。例如 Opera 和 Safari 不会阻止 javascript 写入 cookie。但是,所有主流浏览器的最新版本始终禁止阅读。
但更重要的是为什么你想读取HTTPOnly
cookie?如果您是开发人员,只需禁用该标志并确保您针对 xss 测试您的代码。我建议您尽可能避免禁用此标志。 HTTPOnly
标志和“安全标志”(强制通过 https 发送 cookie)应始终设置。
如果您是攻击者,那么您想劫持会话。但是,尽管有 HTTPOnly
标志,仍有一种简单的方法可以劫持会话。您仍然可以在不知道会话 ID 的情况下乘坐会话。 MySpace Samy worm 就是这样做的。它使用XHR 读取CSRF 令牌,然后执行授权任务。因此,攻击者几乎可以做任何登录用户可以做的事情。
人们对HTTPOnly
标志过于信任,XSS 仍然可以被利用。您应该围绕敏感功能设置障碍。如更改密码字段应要求当前密码。管理员创建新帐户的能力需要验证码,即 CSRF prevention technique,XHR 无法轻易绕过。
【讨论】:
你能详细说明一下蠕虫的事情吗?该链接不起作用,并且从互联网上也没有真正了解太多。谢谢。 @Abhishek Jebaraj 如果您不了解 sammy 蠕虫或 CSRF 令牌,请先尝试了解 same-origin policy 的限制 我想获取一个 http only cookie 的到期日期,我该怎么做【参考方案2】:HttpOnly cookie 的全部意义在于它们不能被 JavaScript 访问。
您的脚本读取它们的唯一方法(利用浏览器错误除外)是在服务器上安装一个协作脚本,该脚本将读取 cookie 值并将其作为响应内容的一部分回显。但是,如果您可以并且愿意这样做,为什么首先要使用 HttpOnly cookie?
【讨论】:
在允许用户从特定浏览器使用您的网站之前,您可能需要对其进行测试以了解用户浏览器是否正确处理 HttpOnly 的 cookie。我正在寻找一个可以确保浏览器支持 HttpOnly 标志的示例。 MS 也建议这样做,但没有关于如何做的进一步建议:Mitigating XSS with HttpOnly 我发现他们建议浏览器版本白名单。我可能是错的,但它不是检查javascript支持的便捷方法吗?你能建议这方面的任何缺点吗?【参考方案3】:你不能。脚本无法访问 Httponly cookie 的目的。
【讨论】:
您的答案与现有答案相比有什么新的或不同的地方??? 同上一个答案的第一句话:The whole point of HttpOnly cookies is that they can't be accessed by JavaScript.
@Akin Zeman:无需使用尖叫帽。您可能想深入了解非暴力沟通。以上是关于如何使用 JavaScript 读取 HttpOnly cookie的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Selenium 读取 javascript 变量?