【Java项目】解决请求路径上明文ID传输导致可能被攻击的方法

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 【Java项目】解决请求路径上明文ID传输导致可能被攻击的方法

问题

这个问题是我公司的一个小业务问题,问题来源于我们发送请求的时候,请求路径上携带的是明文,比如http://xxx/xxx/id=12345,那么别有用心的人就可能会推测出id的生成策略,导致遍历id,自增id的方式来获取我们服务的数据,这是很危险的,所以我的mentor就叫我想一个解决方法。

比如如下的方式就有可能推测出id的生成策略,导致被攻击,我们需要解决的就是这种问题

思路

在解决问题之前,需要先考虑几个因素,先列出我们可能想到的解决方式以及这种方式的问题:

首先就是对id进行加密解密,也就是我们在前端和后端代码处都保存一份密钥,然后使用这一份密钥对id进行加解密,我们后端查出数据进行密钥加密之后再把数据(加密后的数据)返回给前端,然后前端再次使用密钥去解密这个密文。看上去好像可以,不是明文传输了,比如返回的路径可能如下:

但是这样子做仍然有问题,这个问题就在于,前端的代码是共享的可见的,也就是我们的密钥以及解密方法都是直接存储在浏览器并且可以使用F12去查看和修改的,那么得到了密钥之后进行解密然后再递推出ID依旧是可行的,所以这种方式不可以,这也是最开始我想到的方法。

解决

上面说到了,这种解决方式的问题就在于,你的密钥是存储再前端的,那么如果我们有一种办法可以让前端不存储密钥,但是也可以加密解密,那么就能解决这个问题了。

我的思路是,我们的后端代码从数据库取出ID之后,使用后端代码存储的密钥进行加密,后端代码不开源,所以其他人是拿不到密钥的,那么加密方式只有我们开发者才能知道,然后我们将明文ID和加密好的密文一起传输给前端,前端使用明文进行展示,虽然HTTP请求中依旧可以看到明文和密文,但是如果不法分子想要发送一个对应的请求,他同时也需要同时传输一个明文和密文,由于他不知道密钥,也就无法对明文加密得到密文,它传输过来的密文即使存在,是正确的,但是由于密文是错误的,所以它的查询是失败的,他依旧是不知道我们具体的数据,也就一定程度上保证的数据的安全。


相关文章
|
3天前
|
SQL Java 数据库连接
从理论到实践:Hibernate与JPA在Java项目中的实际应用
本文介绍了Java持久层框架Hibernate和JPA的基本概念及其在具体项目中的应用。通过一个在线书店系统的实例,展示了如何使用@Entity注解定义实体类、通过Spring Data JPA定义仓库接口、在服务层调用方法进行数据库操作,以及使用JPQL编写自定义查询和管理事务。这些技术不仅简化了数据库操作,还显著提升了开发效率。
12 3
|
5天前
|
前端开发 Java 数据库
如何实现一个项目,小白做项目-java
本教程涵盖了从数据库到AJAX的多个知识点,并详细介绍了项目实现过程,包括静态页面分析、数据库创建、项目结构搭建、JSP转换及各层代码编写。最后,通过通用分页和优化Servlet来提升代码质量。
17 1
|
28天前
|
JavaScript 前端开发 Java
解决跨域问题大集合:vue-cli项目 和 java/springboot(6种方式) 两端解决(完美解决)
这篇文章详细介绍了如何在前端Vue项目和后端Spring Boot项目中通过多种方式解决跨域问题。
298 1
解决跨域问题大集合:vue-cli项目 和 java/springboot(6种方式) 两端解决(完美解决)
|
12天前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
|
23天前
|
IDE Java 编译器
Java:如何确定编译和运行时类路径是否一致
类路径(Classpath)是JVM用于查找类文件的路径列表,对编译和运行Java程序至关重要。编译时通过`javac -classpath`指定,运行时通过`java -classpath`指定。IDE如Eclipse和IntelliJ IDEA也提供界面管理类路径。确保编译和运行时类路径一致,特别是外部库和项目内部类的路径设置。
|
25天前
|
Java Apache Maven
Java/Spring项目的包开头为什么是com?
本文介绍了 Maven 项目的初始结构,并详细解释了 Java 包命名惯例中的域名反转规则。通过域名反转(如 `com.example`),可以确保包名的唯一性,避免命名冲突,提高代码的可读性和逻辑分层。文章还讨论了域名反转的好处,包括避免命名冲突、全球唯一性、提高代码可读性和逻辑分层。最后,作者提出了一个关于包名的问题,引发读者思考。
Java/Spring项目的包开头为什么是com?
Java 识别请求来自移动端还是电脑端
Java 识别请求来自移动端还是电脑端
348 0
Java 识别请求来自移动端还是电脑端
|
2天前
|
安全 Java 测试技术
Java并行流陷阱:为什么指定线程池可能是个坏主意
本文探讨了Java并行流的使用陷阱,尤其是指定线程池的问题。文章分析了并行流的设计思想,指出了指定线程池的弊端,并提供了使用CompletableFuture等替代方案。同时,介绍了Parallel Collector库在处理阻塞任务时的优势和特点。
|
12天前
|
安全 Java
java 中 i++ 到底是否线程安全?
本文通过实例探讨了 `i++` 在多线程环境下的线程安全性问题。首先,使用 100 个线程分别执行 10000 次 `i++` 操作,发现最终结果小于预期的 1000000,证明 `i++` 是线程不安全的。接着,介绍了两种解决方法:使用 `synchronized` 关键字加锁和使用 `AtomicInteger` 类。其中,`AtomicInteger` 通过 `CAS` 操作实现了高效的线程安全。最后,通过分析字节码和源码,解释了 `i++` 为何线程不安全以及 `AtomicInteger` 如何保证线程安全。
java 中 i++ 到底是否线程安全?
|
2天前
|
存储 安全 Java
Java多线程编程的艺术:从基础到实践####
本文深入探讨了Java多线程编程的核心概念、应用场景及其实现方式,旨在帮助开发者理解并掌握多线程编程的基本技能。文章首先概述了多线程的重要性和常见挑战,随后详细介绍了Java中创建和管理线程的两种主要方式:继承Thread类与实现Runnable接口。通过实例代码,本文展示了如何正确启动、运行及同步线程,以及如何处理线程间的通信与协作问题。最后,文章总结了多线程编程的最佳实践,为读者在实际项目中应用多线程技术提供了宝贵的参考。 ####
下一篇
无影云桌面