如何使用 Spring Boot 和 Angular 应用程序隐藏授权标头

Posted

技术标签:

【中文标题】如何使用 Spring Boot 和 Angular 应用程序隐藏授权标头【英文标题】:How to hide Authorization headers using Spring boot and Angular app 【发布时间】:2020-05-27 14:32:21 【问题描述】:

我已经使用 Spring 安全性实现了 JWT 身份验证。由于 Authorization 标头在浏览器中可见,因此攻击者可以使用 Authorization 标头中存在的令牌来操纵数据。有什么办法可以限制这一点。我正在使用 Spring boot 和 Angular 8。感谢任何帮助。

数据操作示例

【问题讨论】:

你为什么不使用cookie来做同样的事情 您的意思是经过身份验证的用户成为攻击者?除非没有办法获得令牌。对于攻击者,因为您已经使用服务器中的密钥生成了令牌,除非并且直到密钥是公开的;访问令牌不能被伪造。此外,如果经过身份验证的用户也这样做,您的应用程序应该对数据操作请求进行严格验证。就像要更新的记录的所有者实际上是登录用户(来自访问令牌)。 @YashRami,您能否提供任何参考,以便对您有所帮助。 @MidhunMohan,您的意思是对于有效用户,我们不能限制这一点。 @michaeak,我已经更新了问题。请检查一下。 【参考方案1】:

原则上,您永远不能信任客户。你必须处理被操纵的数据。

这意味着无论如何您都必须验证客户端请求。

在高层次上,这类问题有很多解决方案。

1) 在 created-by 的情况下,对我来说这是一个典型的不可更新字段,因为谁创建的东西永远不会改变。

1a) 在 JPA 中,可以用 updatable=false 注释列,因此对于合并操作,这将始终被忽略。

1b) 另一种选择是首先从内存中加载项目,并且仅使用请求中允许为该业务案例保存的属性,将允许的值复制到加载的项目并将加载的项目合并到数据库。

2.) 在其他情况下,例如对于 updated-by 字段,您需要交叉检查经过身份验证的用户是否与 updated-by id 匹配。如果不引发异常/401 什么的。

3.) 我猜这个更适合您的解决方案。我还建议不要传输为项目存储的全部数据,而是使用传输对象或用例对象。使用传输对象或用例对象,它实际上隐藏了数据,因为您只传输专用数据。这也是一个安全建议,因为您只是不想向任何人显示某些数据,因此如果您将它们隐藏在客户端但如果它已经发送给客户端,则有经验的用户始终可以通过检查或操纵。想象一下,每次显示一个人时,您都会发送一个人的薪水信息...... mapstruct 库是一种广泛使用的将数据对象映射到传输对象并返回的解决方案。

希望这有助于找到一个好的解决方案。

【讨论】:

【参考方案2】:

无法从浏览器中隐藏信息。它是一种客户端-服务器通信,因此用户始终可以使用开发工具探索页面 html 内容或 Http 标头或请求参数。

保护您的通信的方法是使用Https(因此包括标头在内的内容被加密)并使用短时间离开 JWT 令牌(通过使用到期日期和刷新令牌),因此攻击者更难冒充某人.

【讨论】:

我们正在使用 Https。我们仍然面临这个问题。https会隐藏授权标头吗? Alreday 令牌将被加密。 Https 将加密标头和请求/响应内容,如果您的应用程序已经在使用 https,则没有必要加密您的令牌,双重加密并不是“更安全”,只是不必要的复杂性。 Http通信的安全性与用户能看到的东西无关,浏览器看不到的,是关于这些信息是如何传输的。

以上是关于如何使用 Spring Boot 和 Angular 应用程序隐藏授权标头的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 spring boot 和 spock 运行测试容器

如何使用 Spring Boot 和 Spring Data 访问实体管理器

如何配置两个实例mongodb使用spring boot和spring data

如何隔离spring boot app redis和spring boot session全局redis

如何使用 Spring-Boot 播种 Spring-Security

如何在 Spring Boot 和 Spring WebFlux 中使用“功能 bean 定义 Kotlin DSL”?