cookies - 将 JWT 存储在内存中如何不受 XSS 攻击?
问题描述
在那个教程中,
把它保存在饼干里怎么样?
在客户端创建 cookie 来保存 JWT 也会容易出现 XSS。如果它可以在您的应用程序之外的 Javascript 在客户端上读取 - 它可能会被盗。您可能认为 HttpOnly cookie(由服务器而不是客户端创建)会有所帮助,但 cookie 容易受到 CSRF 攻击。需要注意的是,HttpOnly 和合理的 CORS 策略无法阻止 CSRF 表单提交攻击,并且使用 cookie 需要适当的 CSRF 缓解策略。
所以作者将 JWT 保存在内存中(变量)。
但我在这篇SO 帖子上读到 javascript 可以读取其他变量。
当攻击者可以在网站上运行 Javascript 时,就会发生 XSS。如果存在 XSS 漏洞,则攻击者可以读取/设置 cookie,通过读取 javascript 变量将用户的详细信息传输到攻击者服务器。那么,如何将 JWT 保存在内存中比存储在本地存储或 cookie 中更安全呢?
我错过了什么吗?(我可能是因为我已经搜索过这个并且我在互联网上一无所获。)
解决方案
将 JWT 存储在内存中仍然会使它们容易受到 XSS 的攻击,但这会使检索令牌变得更加困难。
假设您在代码中使用了恶意库。如果您将令牌存储在 localStorage 中,则库可以将其中的所有内容都变笨,然后将其发送到其他地方。此攻击适用于任何将令牌存储在 localStorage 中的网站。如果您将令牌存储在内存中,则攻击者需要专门针对您的应用程序,因为需要额外的实现细节。
我不建议将令牌存储在内存中,而是使用 HttpOnly cookie 来保护令牌免受 XSS 攻击。现在您只需要担心 CSRF,这可以通过简单地将 cookie 的 SameSite 属性设置为 Lax 来在现代浏览器中实现,或者您可以额外使用 CSRF 令牌。
推荐阅读
- asp.net-core - 长时间运行请求的 Net Core cookie 滑动过期问题
- javascript - 如何从 html 的下拉菜单中删除重复的选项?
- django - 已部署 Django (IIS),记录问题
- r - 计算三个列表中的数字并生成一个大列表
- mariadb-10.5 - MariaDB 10.5.5 数据库在 mysqldump 之后非常慢
- java - spring data @query 和 projection 应该只选择需要的字段,但情况并非如此
- ruby-on-rails - Rails Postgres fe_sendauth:没有提供密码错误
- blazor - Blazor IL 修剪(几乎)没有结果
- outlook - 使用 php 将会议邀请发送到 Outlook 房间
- flutter - 一个RenderFlex右边溢出了3.0像素/Flutter