snakeyaml1.x升级2.x导致项目启动报错

snakeyaml1.x升级2.x,修复漏洞

1.背景

在工作中,经常会有漏洞扫描,有一次看到了snakeyaml的漏洞:
在这里插入图片描述

项目框架:springBoot
版本:2.2.6.RELEASE

snakeyaml 中央仓库信息

snakeyaml中央仓库地址:https://mvnrepository.com/artifact/org.yaml/snakeyaml

目前中央仓库显示,1.x版本全有漏洞警告,可用版本只有2.x
在这里插入图片描述

3.修复漏洞:

修复方式如下: (此方法仅限springBoot 2.7.10及以上版本使用)
在这里插入图片描述

            <dependency>
				<groupId>com.baomidou</groupId>
				<artifactId>mybatis-plus-boot-starter</artifactId>
				<version>${mybatis-plus.version}</version>
				<exclusions>
					<exclusion>
						<groupId>org.yaml</groupId>
						<artifactId>snakeyaml</artifactId>
					</exclusion>
				</exclusions>
			</dependency>

			<dependency>
				<groupId>org.yaml</groupId>
				<artifactId>snakeyaml</artifactId>
				<version>2.0</version>
			</dependency>

如果你的SpringBootStarter版本在2.7.10以下,请继续看完下面内容

2.7.10版本以下的项目,仅做此排除和重新引入2.x依赖操作,那么项目会启动失败,你会得到以下两种启动报错:

报错一:

java.lang.NoSuchMethodError: org.yaml.snakeyaml.constructor.Constructor: method <init>()V not found

报错二:

java.lang.NoSuchMethodError: org.yaml.snakeyaml.representer.Representer: method <init>()V not found
4.启动报错的原因:

snakeyaml 2.x版本去掉了Constructor和Representer两个类中的无参构造,但springBootStarter2.7.10以下版本会加载这个无参构造,所以项目启动会失败
在这里插入图片描述

5.解决办法:

1.升级springboot-starter至2.7.10及以上 (springBoot版本升级,考虑整个项目的影响,慎重)

2.重写这两个类,加上无参构造(本文解决方案)

原理:Java父子加载器,覆盖maven依赖jar包中的类。

若idea无法下载源码,参考以下github地址

snakeyaml源码gitHub参考地址:

https://github.com/snakeyaml/snakeyaml/blob/master/src/main/java/org/yaml/snakeyaml/representer/Representer.java

1.在src目录下按这两个类的路径建包,复制这两个类源代码,增加无参构造
在这里插入图片描述
在这里插入图片描述

做完此重写操作,即可修复升级2.x后不能启动的问题。

ps: 查看maven 依赖树结构命令
在idea命令窗口,执行: mvn dependency:tree
在这里插入图片描述

本文绑定附件:org.zip 。直接将org.zip解压,放在src目录下即可

  • 10
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木子丶Li

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值