首页 > 解决方案 > 如何在 localStorage 中破坏 JWT?

问题描述

我搜索并阅读了很多关于 jwt 安全性的文章。很多人说将令牌保存在本地存储中不安全。但实际上没有人给出一些实际的例子。例如,somoene 如何在本地存储中使用 jwt 进行 XXS 攻击?

我发现的唯一例子是这个:

https://www.youtube.com/watch?v=g21uHNIIewM

但是在这里他在 3:10,他解释的不是 xss 攻击,而是可能的情况,如果我无意中打开我的电脑,他可以从本地存储复制我的 jwt,保存然后粘贴到他的电脑在家里,他可以访问所有内容,例如管理路由。

但我没有找到一个例子,somoene 如何直接用 jwt 令牌做坏事。例如我有网络应用程序,用户需要注册并在登录后。我在我的 JWT 中有这个有效负载,在那里我只会将管理员角色分配给特定用户(仅在开始迁移时,我将 admin 分配给某些用户,之后对于每个其他新注册的用户,他都会获得 admin - false )

{
  "name": "John Doe",
  "admin":false,
  "id":1
}

例如,当用户登录时,我将从服务器发送的 jwt 保存在本地存储中。

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiSm9obiBEb2UiLCJhZG1pbiI6ZmFsc2UsImlkIjoxfQ.GY9qxlilipXdndTGHWGcI-BDIkZFV5xjxOW-EVTHCQs

我有管理面板,我在其中隐藏了它们的路由,如果用户角色不是管理员,则阻止访问 - 所以首先我从存储的 jwt 中读取有效负载

let token = localStorage.getItem('token');
let jwtObject = JSON.parse(atob(token.split('.')[1]))
// and i get
{name: "John Doe", admin: false, id: 1}

我检查路线

if(jwtObject.admin == true) {...};

假设某个用户想对我的 Web 应用程序做些坏事。他注册,登录,获得 jwt 有效负载,其中 admin 为 false。例如,他还可以查看他的令牌

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiSm9obiBEb2UiLCJhZG1pbiI6ZmFsc2UsImlkIjoxfQ.GY9qxlilipXdndTGHWGcI-BDIkZFV5xjxOW-EVTHCQs

在本地存储中。他怎么能做“某事”,以便他可以将其自我管理的有效负载更改为真,即使它是从服务器发送为假的,之后他将有权访问管理面板的所有路由?

我在这里标记了角度和反应,所以我会听到更多人关于他们正在使用的 java 脚本工具的意见和例子。

标签: javascriptreactjsangularjwt

解决方案


在我看来,如果你有一个 HTTPS 并且你没有在你的 JWT 中输入密码,那很好。用户令牌信息是用户自己知道的,例如电子邮件、角色等。也许您可以将其编码为 base64,因此对于普通用户来说有点混乱。

此外,重要的是为该令牌拥有一个强大的安全验证器,因此用户无法更改它的签名,也许它的角色,那里有几个令牌助手库和一些后端处理来检查令牌是否是和过去发送的一样。最后一件事,刷新令牌。


推荐阅读