栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

springboot升级log4j2,解决漏洞问题

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

springboot升级log4j2,解决漏洞问题

最近log4j2爆出有重大漏洞问题,公司也紧急要求各个项目自己查验,要求将log4j的版本升到安全版本

目前我们使用的是springboot 1.5.9版本,内置log4j2是2.7的版本,虽然整合了mybatis,但是log4i的版本依然是以springboot内置为主

2个方案,一个是官方提供的,个人推荐,另一个是根据网上的总结出来的,测试结果也是对的

方法一:spring官网推荐(强烈建议用官网的)

https://spring.io/blog/2021/12/10/log4j2-vulnerability-and-spring-boot
官网介绍了2种情况,

情况一:直接用soringboot父pom的,类似如下的(推荐如下方式)
	
        org.springframework.boot
        spring-boot-starter-parent
        1.5.9.RELEASE
         
    

这种情况下的,就需要在自己项目的pom.xml文件中添加如下代码


    2.16.0

若果自己项目的pom.xml文件里已经有标签了,就自行在里面添加2.16.0,版本自己选择,最好是>=2.15版本

这边补充一下原因,可以覆盖父类pom文件里引入的依赖的版本
改完以后,可以自己看下自己项目的依赖版本是否升级了,我这边是选择升级到2.15的版本
用这种方式的好处是,你不需要一个一个去找,基本只要父pom设置好了,其他的基本就会同步升级

情况二:没有将springboot的pom文件作为父pom,而是当作依赖引入的

    
        
            org.apache.logging.log4j
            log4j-bom
            2.16.0
            import
            pom
        
        ... other dependencies including spring-boot-dependencies
    

具体的我没有试过,只是把官网的翻译了一下,版本自己选择

方式二 直接说怎么改(这个是同事改的,我直接拿过来用了)

父pom.xml


   org.springframework.boot
   spring-boot-starter-log4j2
     
    
     org.apache.logging.log4j
     log4j-api
    
    
     org.apache.logging.log4j
     log4j-core
    
    
     org.apache.logging.log4j
     log4j-slf4j-impl
    
   
  
    
   org.apache.logging.log4j
   log4j-api
   2.15.0
  
  
   org.apache.logging.log4j
   log4j-core
   2.15.0
  
  
   org.apache.logging.log4j
   log4j-slf4j-impl
   2.15.0
  

web模块的pom.xml

  
   org.apache.logging.log4j
   log4j-web
   
   
    org.apache.logging.log4j
    log4j-api
   
   
    org.apache.logging.log4j
    log4j-core
   
   
  
    
   org.apache.logging.log4j
   log4j-api
   2.15.0
  
  
   org.apache.logging.log4j
   log4j-core
   2.15.0
  
  
   org.apache.logging.log4j
   log4j-slf4j-impl
   2.15.0
  

原理说一下:就是将原本依赖里需要的有关log4j的jar包依赖剔除掉,,,然后重新引入需要的jar包,标明版本即可


之前网上有人写了一段代码
将pom文件里如下代码进行替换,启动项目时报错了
原:


org.springframework.boot
spring-boot-starter-log4j2 

替换为:


    org.springframework.boot
    spring-boot-starter-log4j2
    
        
            org.apache.logging.log4j
            log4j-api
        
        
            org.apache.logging.log4j
            log4j-core
        
    


    org.apache.logging.log4j
    log4j-api
    2.15.0


    org.apache.logging.log4j
    log4j-core
    2.15.0

我试了一下,替换后报错了,我原本内置log4j版本是2.7的
替换后,一直报错,项目起不来,classNotFound

java.lang.NoClassDefFoundError: org/apache/logging/log4j/util/ReflectionUtil
	at org.apache.logging.slf4j.Log4jLoggerFactory.getContext(Log4jLoggerFactory.java:42)
	at org.apache.logging.log4j.spi.AbstractLoggerAdapter.getLogger(AbstractLoggerAdapter.java:47)
	at org.apache.logging.slf4j.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:29)
	at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:284)
	at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:304)
	at com.sunmnet.ybt.ApplicationConfig.(ApplicationConfig.java:59)
Caused by: java.lang.ClassNotFoundException: org.apache.logging.log4j.util.ReflectionUtil
	at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:355)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
	... 6 more
Exception in thread "main"

这里我说下我这边的原因,有兴趣的可以看下
我去2.7版本里找了一下,有这个类,但是2.15版本确实没有这个类,我看了一下我整个项目的依赖,发现了一个问题,

发现问题没有?上面2个jar包版本升级了,但是还有2个没有
而且,我在web模块引入了一个log4j-web的依赖,它的版本是2.7,而这个依赖又需要log4j-api和log4j-core,这两个的版本又升级了,版本不一致的问题导致出现了有的类找不到,是这个依赖的版本出问题了,也要升级。
就很麻烦,你需要去每个模块的pom文件看看有没有单独引入有关log4j的依赖,所以强烈建议按照spring官网推荐那样设置
总而言之,我之所以出现上面的问题是因为,有其他地方单独引入与log4j相关的依赖,且版本与你升级的不一致。(如有觉得说的不对的,欢迎指出)。所以非常建议使用spring官网推荐的方式升级log4j2版本的方式,除非你十分清楚你的项目,知道哪些地方有有关log4j2的依赖

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/671305.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号