一、背景
为了解决项目中log4j漏洞引发的安全隐患,想到的应对方案有两个:
①不再使用log4j,去除log4j依赖
②升级log4j版本至漏洞修复版本(2.15+)
二、方案缺陷
①项目太多了,一个一个地去exclude非常的繁琐,而且如果增加新项目还要时刻惦记这个事情,维护非常麻烦;
②另外可能会存在引入的某依赖当中会隐含log4j的依赖,悄悄地引入。
三、优化解决方案
①全局去除依赖
在父模块的pom文件里增加依赖管理
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
<exclusions>
<exclusion>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</dependencyManagement>
这样可以全局去除spring-boot-starter里自带的log4j依赖
全局去除前:
全局去除后:
尽管去除了spring-boo-starter当中的loh4j依赖,但是无法去除其他依赖当中隐含的log4j依赖
②控制log4j版本
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.17.1</version>
</dependency>
</dependencies>
</dependencyManagement>
效果:
即使不是直接引入的log4j-api依赖,也可以通过这种方式控制该依赖版本。
四、总结
方案①适用于已知那些包含log4j的依赖,而这种依赖又不太多,同时也不打算使用log4j的情形。
方案②适用接继续使用log4j的情形,推荐使用该方案,不会存在方案①那样的缺陷。另外,保留了log4j的可用性,如果其他日志解决方案出现了类似log4j这样的巨大漏洞,还可以使用log4j。