httpOnly如何防止恶意包窃取其中的内容?

How does httpOnly prevent from malicious package to steal the content in it?

例如,如果安装的第三方包向其服务器发出 HTTP 请求,并且默认情况下,任何 HTTP 请求都会在请求 headers 中留下 cookie 内容,这不是使内容暴露给接收请求的服务器?我不明白 httpOnly 如何防止访问令牌被泄露...

httpOnly 属性的目的是从 JavaScript 上下文中隐藏 cookie。

要观察它,您可以在任何网页的控制台中键入 document.cookie,您会注意到结果包含所有 而非 httpOnly 和来自当前域。您可以使用 DevTools 的应用程序选项卡进行验证。

这意味着如果攻击者以某种方式设法在用户的网页上执行恶意代码(例如,通过利用脚本注入漏洞),他可能能够代表该用户发送请求,但他不应该能够检索 cookie 的值。

HTTP 请求仅携带适用于所请求域的 cookie,而不是浏览器的所有 cookie。如果您的浏览器带有 bank.comshop.comevil-site.com 的 cookie,则对 evil-site.com 的请求只会随请求一起发送 evil-site.com cookie。没那么有用。

现在假设恶意脚本感染了 bank.com 并将其自身放置在该域的页面上。 现在该脚本 运行 在 bank.com 和当前正在查看的用户的上下文中。 它现在可以读取 bank.com 的非 HttpOnly cookie 使用document.cookie and send them to evil-site.com with a simple script。这意味着如果您登录 bank.com 并查看受感染的页面,您的登录 cookie 现在可能会被盗。

将 cookie 标记为 HttpOnly 告诉浏览器不要将 cookie 公开给 JavaScript,即任何脚本,无论是否合法,都无法从 document.cookie 读取 cookie 的值。因此,如果 bank.com 使他们的登录 cookie HttpOnly,页面上的任何脚本都无法读取此 cookie。但是,当 cookie 存在且有效时,cookie 仍会在请求和响应中在浏览器和 bank.com 之间来回传递。

HttpOnly 只是防止 cookie 被盗的众多措施之一,应该辅之以其他安全功能。 Secure 确保 cookie 仅通过 HTTPS 连接发送。 SameSite 定义允许 cookie 跨站点的时间。 HTTPS 连接阻止通过网络读取请求。