jdk9 出现比 log4j 更大的漏洞

2022-03-29 22:11:46 +08:00
 asd7160

https://weibo.com/1705822647/Lm0FY1WyS#comment

https://imgur.com/KSkhaQO

16391 次点击
所在节点    Java
101 条回复
Bingchunmoli
2022-03-30 13:04:41 +08:00
@kran 外化到配置不理解
cwyalpha
2022-03-30 13:07:14 +08:00
还是 jdk8 的多
kran
2022-03-30 13:18:39 +08:00
@Bingchunmoli 你没看明白或者我没说明白,我上面说的自动装配不是类的自动装配( di ),而是库。另外 ioc 为什么就得扫包?如果必须扫,那其它的 di 框架都是假的,如果不必须,那目的就不完全是 di 。
Bingchunmoli
2022-03-30 13:30:35 +08:00
@kran spring-framework 是不扫包的,但是你要声明每一个你要用的 bean ,SpringBoot 简化配置,通过扫描的方式,省略繁琐的配置。 一个项目你要用的 100 个类,你要配置 100 个甚至更多的 bean 标签,折磨啊
kran
2022-03-30 13:31:33 +08:00
@Bingchunmoli 外化到配置确实不是通用语吧,这么说吧,程序员面向接口 /类 /对象编程,在 spring 里面向配置 /注解编程,虽说过于极端,但也是它很突出的一个现象。用 spring 做项目给我感受最大的是离不开搜索引擎(说我菜我肯定认),因为注解和配置打断了我通过 IDE 调试的过程(还是菜),而不用的时候我都可以通过 IDE 和库文档进行下去,几乎不用去搜索。
Bingchunmoli
2022-03-30 13:31:51 +08:00
@kran DI 肯定是要知道使用的对象和需要注入的对象全类名,构造函数和 setter 方法,如果 IOC 不扫包,这些都是手动配置, 库有自动装配吗。 你是指 SpringBoot 的 starter 吗
chendy
2022-03-30 13:33:01 +08:00
@kran
1. 既然对 spring 了解不深,那其实很多道理也没法讲清楚。只能说 spring 做得够早够好,抢占了先机,后来的框架虽然有各种优势但是都做不到颠覆,于是大家就还用 spring
2. 事物控制是可以独立使用的,和依赖注入没关系,各种东西自己 new 自己组装也行。事务切面就不用说了是依赖切面的。编程式的事务 api 貌似也有,但是应用场景太少了
3. 编程组装可以,但是东西多了之后编程组装太墨迹了不是么
4. bean 声明之类的外化配置现在没人用了,现在只是把真正的“配置”外化
kran
2022-03-30 13:35:34 +08:00
@Bingchunmoli 这个我知道,但是拿 guice 来对比呢?
Bingchunmoli
2022-03-30 13:35:51 +08:00
@kran 我可以通过规范了解到 spring 的都是 springl 开头,然后都有代码提示,然后也可以点击跳转对应的 Properties 例如 RocketMQProperties
/**
* The name server for rocketMQ, formats: `host:port;host:port`.
*/
private String nameServer;

/**
* Enum type for accessChannel, values: LOCAL, CLOUD
*/
private String accessChannel;

private Producer producer;
对应名字和注释挺简单的,如果是需要 new 就强耦合了,多数据源多种数据库也会麻烦。
@bean 去注解大部分是为了自定义,SpringBoot 的 starter 默认是可用的(三方做的不一定),为了项目的需求进行一定的替换定制化,如果该类用户代码写了注入容器,Spring 就会取消自己的装配
newmlp
2022-03-30 13:36:00 +08:00
@sagaxu 显然不是
newmlp
2022-03-30 13:37:07 +08:00
@kernelpanic 显然不是这个洞
nothingistrue
2022-03-30 13:37:25 +08:00
现在 Spring Boot 也是滚动更新,J9 以上也是滚动更新。凡是滚动更新,不出漏洞才不正常。当然,对于 Spring Boot ,以及所有库,的滚动更新,如果你写好写全了单元测试代码(相比于只编码,工作量最少加两倍),那你只要一直用最新稳定版本就没事了,漏洞顺手就改,连手动测试都不需要。以上仅限于上层应用框架,JKD 这种底层基础设施,能不升级就别升级,尤其是 J9 以后那狗日的不考虑向后兼容性的滚动升级。
newmlp
2022-03-30 13:38:41 +08:00
@lovelynn 因为这个洞可以导致任意代码执行,并且条件只需要 spring+Java9 及以上
Bingchunmoli
2022-03-30 13:40:13 +08:00
@kran 例如 redis
官方默认是可用,但是用户想用 json 可视化
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(RedisOperations.class)
@EnableConfigurationProperties(RedisProperties.class)
@Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class })
public class RedisAutoConfiguration {

@Bean
@ConditionalOnMissingBean(name = "redisTemplate")
@ConditionalOnSingleCandidate(RedisConnectionFactory.class)
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<Object, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
return template;
}

@Bean
@ConditionalOnMissingBean
@ConditionalOnSingleCandidate(RedisConnectionFactory.class)
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
return new StringRedisTemplate(redisConnectionFactory);
}

}

然后用户配置
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
RedisSerializer<Object> redisSerializer = getRedisSerializer();
redisTemplate.setKeySerializer(stringRedisSerializer);
redisTemplate.setValueSerializer(redisSerializer);
redisTemplate.setHashKeySerializer(stringRedisSerializer);
redisTemplate.setHashValueSerializer(redisSerializer);
redisTemplate.setDefaultSerializer(redisSerializer);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}

@Bean
public RedisSerializer<Object> getRedisSerializer() {
Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);
/*
* 支持 JDK8 LocalDateTime
*/
om.registerModule(new Jdk8Module())
.registerModule(new JavaTimeModule())
.registerModule(new ParameterNamesModule());
serializer.setObjectMapper(om);
return serializer;
}
自己的自定义去覆盖。
Bingchunmoli
2022-03-30 13:42:54 +08:00
@kran guice demo 首先来配置依赖关系。我们继承 AbstractModule 类,并重写 configure 方法即可。在 configure 方法中,我们可以调用 AbstractModule 类提供的一些方法来配置依赖关系。最常用的方式就是 bind(接口或父类).to(实现类或子类)的方式来设置依赖关系。
一个项目,几百类,都要一一绑定吗
Bingchunmoli
2022-03-30 13:45:09 +08:00
@kran 用户的需求显然是简单更好,而且 java 语言,性能已经不敏感了->
知乎的评论
a:
我们公司的开发框架就是用的这个,但是做很多变动,比如 inject 注解换成了 javax 的,自动扫描 bean ,不用手动标记 singleton ,还没看懂源码是怎么做到的
b:
建议定制的事别搞,不要去学 spring 的 autoscan ,用原生的就挺好了
Bingchunmoli
2022-03-30 13:46:54 +08:00
@chendy 正解, 有些其他优势是取舍达到的。 其他可能只是填补空缺,有很多三角形理论,只能保证两点,想三点全占不可能
kran
2022-03-30 13:51:36 +08:00
@Bingchunmoli 虽然说我很菜,但是这些基础我还是懂的,但是这个过程主要是靠搜索引擎和一些技术文章慢慢积累总结。可以说当时在用 springboot 时,碰到问题去查搜索引擎是第一反应。这种编码上的割裂感前所未有的强烈,也是我不打算再继续深究这个框架的原因。不讨论了。
kran
2022-03-30 13:53:57 +08:00
@Bingchunmoli 这个回一下,guice 不是只有这一种用法。
cxxxxx
2022-03-30 13:57:33 +08:00
android 开发者:他们在讨论啥?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/843724

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX