如何在 localStorage 中破坏 JWT? [关闭]

Posted

技术标签:

【中文标题】如何在 localStorage 中破坏 JWT? [关闭]【英文标题】:How can JWT be compromised in localStorage? [closed] 【发布时间】:2021-03-22 21:26:34 【问题描述】:

我搜索并阅读了很多关于 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 为假。例如,他还可以查看他的令牌

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiSm9obiBEb2UiLCJhZG1pbiI6ZmFsc2UsImlkIjoxfQ.GY9qxlilipXdndTGHWGcI-BDIkZFV5xjxOW-EVTHCQs

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

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

【问题讨论】:

最好将用户角色(如管理员、客户等)保留在数据库中,而不是依赖令牌本身。如果您只能在令牌中存储用户 ID,则可以通过查询数据库来查询用户名、角色、电子邮件等。 您的 Jwt 没有资格说用户是否是管理员,因为它可以在您存储的任何位置进行更改。相反,将令牌发送到您的后端并让响应决定它是否是管理员角色 只要你不信任你的前端,并且总是检查后端的签名,你就不用担心。当您有一个单页应用程序时,将admin 布尔值存储在前端很好并且非常有用,以仅向用户显示他需要查看的内容。如果非管理员将令牌更改为 admin: true 并且可以访问管理员 vue,谁在乎呢?因为您将始终在返回数据以填充该 vue 之前检查签名。 Keycloak 是最受欢迎的 IAM,正是这样做的。它将角色存储在令牌中,供前端使用 Tnx 供您回复。但是blex我不明白。你的意思是-总是检查签名-?当他更改有效负载 admin - true 时,当我检查 admin 是否为 true 时,此语句将为 true,他将访问 admin 路由 我有一个 SPA,我可以在其中检查用户是否使用令牌登录。如果他是我授予他访问应用程序的权限,否则我会重定向。从技术上讲,他仍然可以到达该路线,因为 SPA 通常是使用 react 或 vue 构建的,并且是在浏览器中运行的 javascript。但是,如果他在没有令牌的情况下到达路线,他将无法看到数据,因为只有使用有效令牌才能查看数据。但他没有。这意味着他可能会看到一个空的 UI,或者一个 UI 女巫只有永远不会加载的加载指示器 【参考方案1】:

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

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

【讨论】:

以上是关于如何在 localStorage 中破坏 JWT? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何将 JWT 保存到 localStorage

如何在不破坏 localStorage 类型的情况下存储和获取对象?

如何在 Vue JS 中处理登录 JWT 令牌?

在 cookie 中存储 JWT 令牌后,如何在 ASP.NET Core 3.1 中破坏该 cookie 并获取信息

我在哪里可以将 jwt 令牌存储在 localStorage 中?

JWT - 将它们存储在 LocalStorage 与 SessionStorage