【问题标题】:How does httpOnly prevent from malicious package to steal the content in it?httpOnly 如何防止恶意包窃取其中的内容?
【发布时间】:2022-01-18 02:51:18
【问题描述】:

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

【问题讨论】:

  • httpOnly 是为了防止欺骗。如果您想保护您的 cookie,您还应该使用 secure:true
  • 但是,secure: true 只强制使用 HTTPS,因此同一 Internet 上的其他人无法理解其中的实际内容,但接收者可以。
  • 对不起,“所以同一 Internet 上的其他人无法理解其中的实际内容”不是真的。 HTTPS 旨在防止这种情况发生。

标签: javascript cookies xss cookie-httponly


【解决方案1】:

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

现在假设一个恶意脚本感染了bank.com,并将自己置于该域中的页面上。 现在该脚本正在bank.com 和当前查看用户的上下文中运行。 它现在可以使用document.cookiesend them to evil-site.com with a simple script 读取bank.com 的非HttpOnly cookie。这意味着,如果您登录到 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 连接阻止通过网络读取请求。

【讨论】:

  • 很好的解释。我尝试从localhost:8080 中的Web 客户端向localhost:3002 中的后端API 发送带有withCredentials: true 的请求,该API 分别允许向客户端发送CORS 标头-否则该请求将被拒绝。该请求确实收到了 cookie,并在 cookie 部分的域“localhost”下自动添加到浏览器。然后我请求了另一个 API,也在 localhost 上但在端口 3003 上,这也允许 8080 的 CORS,并且带有 httpOnly 的 cookie 也被发送并且能够从 3003 读取。
  • 好吧,我已经从 localhost:8080 测试了它到一些不同的真实域(实际上更改了 /etc/hosts 文件)并且它有效!没有饼干通过!太棒了。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-18
    • 2018-08-18
    • 2011-05-09
    • 2019-02-01
    • 2018-05-13
    • 1970-01-01
    • 2013-05-19
    相关资源
    最近更新 更多