我正在尝试修复 Snyk 工具在我的程序中发现的一些漏洞,但其中一些漏洞来 self 正在使用的库(例如 Apache 的 Pulsar)。 例如,Pulsar 使用的是 gson 2.8.6 版本,根据 Snyk 的说法,该版本存在漏洞,下一个安全版本是 2.8.9。 是否可以强制我使用的所有库都使用 gson 2.8.9 版本(通过 gradle)?或者更确切地说,不是因为这是一个非常愚蠢的想法,容易出现意想不到的行为?
谢谢
最佳答案
这是一件合理的事情。正式支持升级库的新版本 pulsar 会更好,但您通常可以安全地升级传递依赖项。特别是,如果库作者遵循语义版本控制,则点版本(即 2.8.6 -> 2.8.9)可能是安全的。
Gradle 提供了多种方法来做到这一点,目前(从 gradle 7.3 开始)最常用的方法似乎是使用约束。
例如,如果您的依赖项如下所示:
dependencies {
implementation 'org.apache.pulsar:pulsar-client-all:2.9.1'
}
运行依赖关系洞察将显示我们正在解决 gson 2.8.6
`./gradlew dependencyInsight --dependency gson`
...
com.google.code.gson:gson:2.8.6
\--- org.apache.pulsar:pulsar-package-core:2.9.1
\--- org.apache.pulsar:pulsar-client-all:2.9.1
\--- compileClasspath
我们可以添加一个约束,强制它使用这样的较新版本。
dependencies {
implementation 'org.apache.pulsar:pulsar-client-all:2.9.1'
constraints {
implementation('com.google.code.gson:gson:2.8.9') {
because 'previous versions have a security vulnerability'
}
}
}
现在我们得到以下结果
com.google.code.gson:gson:2.8.9
...
Selection reasons:
- By constraint : previous versions have a security vulnerability
- By conflict resolution : between versions 2.8.9 and 2.8.6
com.google.code.gson:gson:2.8.9
\--- compileClasspath
com.google.code.gson:gson:2.8.6 -> 2.8.9
\--- org.apache.pulsar:pulsar-package-core:2.9.1
\--- org.apache.pulsar:pulsar-client-all:2.9.1
\--- compileClasspath
现在正在按照您的要求解析 2.8.9。
Gradle 有相当广泛的 documentation关于依赖管理,这是查找有关此类内容的更多信息的好方法。
关于gradle - 是否可以在整个项目中强制使用特定的库版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70592520/