不知道是不是我个人的感觉,我觉得作者回复这个问题的时候已经有一点怒气了:这都是些什么问题啊?前我已经回复了两次不受影响啊?怎么感觉我的项目使用者怎么都不了解 Lombok 的基本原理呢?
在作者回复完这个冒失的提问者之后,这个提问者还是很礼貌的回复了一下:
谢了老铁,我检查了,我使用的是 SpringBoot 默认的 logback。
作者也把这个问题给置顶了,且修改了这个 issue 的标题。
所以,经过前面的一番解读,现在你再看这个标题:
为什么作者要强调“itself”,因为 Lombok 确实是提供了日志的功能,但是至于引用什么包,哪个版本的包,和 Lombok 都没有任何关系。 Lombok 本身(itself)是安全的。
最最后,作者给了 log4j 漏洞对于 Lombok 的 Latest assesment(最新评估),算是总结性发言:
给大家翻译一下关键的东西。
这个漏洞只存在于 2.16.0 版本以下的 Log4j code 包中,而不存在于任何其他日志框架中。
Lombok 没有传递依赖任何 Log4j 包,也没有声明对任何东西的依赖。
如果你使用任何 Lombok 的注解,比如 @Log4j,Lombok 将生成使用这些库的代码,但是你的项目里面必须要包含对这些库的依赖,否则 Lombok 生成的代码将无法编译。
同样地,你要负责在你的运行时中拥有这些包,否则类的初始化可能会失败。
在 Lombok 测试代码中,我们曾经有一个包含这个漏洞的版本,但是由于测试不处理任何用户输入(测试是硬编码的),而且生成的代码甚至没有被执行,运行测试并没有导致执行测试的机器上出现 RCE(远程代码/命令执行漏洞)。
所以,老铁们,Lombok 本身不需要做任何改变,也不对你的项目负任何安全责任,毕竟包不是我们引进来的。
如果你不同意目前的评估,请在这个问题上添加评论。
但是,请确保你已经阅读了其他评论,并确保你理解了这个问题。
最后这两句话,单独拎出来,我可太喜欢这两句话了:
求求你提问之前三思,不要浪费我们的时间,不要问那些你自己就能搞清楚的问题。
如果你认为我们遗漏了什么,或者有新的信息,请大声的说出来。
然后,你注意这里作者用的小标题是:The balancing act.
翻译过来是“平衡的行为”,啥玩意?
NO,NO,NO:
一个小俚语送给大家,不必客气。
补充说明
前面把主线剧情过完了,现在我来几个补充说明吧。
先说前面按下不表的关于日志的注解。
其实 Lombok 里面关于日志的注解还真是挺多的,可以直接看官方的文档:
这么多注解,一个个的讲也没啥意思,我这里就挑 @Slf4j 、@Log4j2 这两个演示一下吧。
首先,我们可以搞个纯净的 SpringBoot 项目,只包含这两个依赖:
这个时候如果我什么都不动,只是稍微改一下启动类:
然后为了排除干扰项我把日志打印的级别调整到 Error:
logging.level.root=error
同时关闭 banner 输出:
spring.main.banner-mode=off
banner 就是这个玩意:
可以看到我们这个时候使用的日志是 logback,原因我在之前的文章里面也讲过了,因为 Springboot 默认使用的日志实现是 logback。
这一点,从项目依赖上也可以看出来:
另外,你注意一下,我特意把 import 部分也截出来了,除了 @Slf4j 注解外,这里并没有引入任何日志相关的注解。
然后,我再关注一下这个时候编译出来的 class 文件:
自动引入了 slf4j 相关的包,然后生成了这行代码:
private static final Logger log = LoggerFactory.getLogger(LogdemoApplication.class);
这个时候不知道你有没有想到编译时注解相关的东西,但是不慌,这里还是先按下不表。
来,我问你:为什么它能引入 slf4j 相关的包?
因为我依赖了呀:
好,如果这个时候我把 logback 的核心依赖给拿掉,会出现什么事情,你觉得会不会编译不过呢?
不会编译不过,因为 Slf4j 包还在,它只是一个日志门面。
但是运行的时候会抛出异常,因为找不到日志相关的具体实现类:
然后,如果我想用 log4j2 日志实现怎么办呢?
之前的文章中也写过: