springboot架构下安全漏洞修复

未分类
1.3k 词

起因

最近公司因为安全扫描,java 项目扫出了一堆漏洞需要修复,以便满足安全部门的考核需求,所以本人就 springboot 架构下的漏洞进行一个修复。文章主要介绍一些修复漏洞的小技巧。

思路

因为很多漏洞是 springboot 集成 jar 包引入的漏洞,所以可以考虑升级 springboot 来大幅度的降低漏洞。
公司使用的 springboot 是 2.4.1,我的计划是把它升级到 2 的最新版本 2.7.18。
注:这里不能直接跨版本升级,springboot跨版本很多架构已经改变了
springcloud 跟 springboot 是有关联性的,我们需要到https://spring.io/projects/spring-cloud 去查找 2.7.x 对应的最新版本,我这里找到的是2021.0.9

当然,从 2.4.x 升级到 2.7.x 也会碰到架构变更的问题,我这边主要碰到了两个问题

1. springbean 循环依赖问题

循环依赖在 2.4.x 的时候是可以的,但在 2.7 的时候,做了启动的循环依赖校验,导致启动不了。
第一种解决办法是声明不做循环依赖的检查(不推荐),
在 Spring 框架中,循环依赖是一个被设计为默认情况下不被支持的特性,因为它可能导致应用程序的不稳定性和难以维护性。然而,如果你确实需要在特定情况下允许循环依赖,你可以通过设置 spring.circular.dependency.check 属性来实现。

1
spring.circular.dependency.check=none
第二种手动解决依赖即可,因为公司项目存量代码还算客观,我选择了这种。具体方案有以下几种
1
2
3
1.构造函数注入:使用构造函数注入代替字段注入可以帮助解决循环依赖问题。通过构造函数注入,Spring 可以在创建 Bean 实例时将依赖项传递给 Bean。
2.使用 @Lazy 注解:在 Spring 中,@Lazy 注解可以延迟 Bean 的初始化,从而避免循环依赖。通过将 @Lazy 注解添加到 Bean 上,可以延迟 Bean 的初始化,直到第一次使用该 Bean。
3.使用 @DependsOn 注解:@DependsOn 注解可以指定 Bean 依赖的其他 Bean 的名称,在创建 Bean 时,Spring 会确保依赖的 Bean 先被创建。这可以帮助解决循环依赖问题。

2. swagger 依赖变更了

swagger 有原先的 springfox 变为了 springdoc-openapi-ui
这个没办法,需要挨个修复

其他安全漏洞的定位和修复

即使是 springboot 升级到 2.7.x,项目依然还有别的安全漏洞存在,需要手动定位并修复。
修复漏洞时,我们依然需要注意最好不要跨大版本升级 jar 包

如何定位最近无安全漏洞的 jar 包版本号

我们可以去https://mvnrepository.com/
如下图,箭头有红字标识的,都是有安全漏洞的版本号,选一个没标识的去尝试升级
图片

注: 去 pom.xml 修复版本的时候,添加无漏洞的 pom 依赖到 <dependencyManagement> 下即可

最后

升级时切记不可一次操作完所有,一步一步慢慢来,升级完一个,尝试去启动一下项目,并做好一次提交记录,防止找不到记录返工。