了解 JEP290 的原理吗
JEP290 的核心原理:反序列化白名单和黑名单
JEP290 没有从根本上重写 Java 的反序列化机制,而是在现有机制之上,增加了一个过滤层(Filter)。这个过滤层在反序列化数据之前,会先对即将被实例化的类进行检查
JEP290 的核心思想可以概括为:在反序列化过程中,根据一个可配置的白名单或黑名单,来决定哪些类可以被实例化
它主要通过以下两种方式实现:
- 全局配置:在 JVM 启动时,可以通过设置系统属性来配置一个全局的过滤规则
jdk.serialFilter
:这是最主要的系统属性。它的值是一个字符串,定义了允许或拒绝反序列化的类- 语法:这个字符串支持简单的通配符和规则,例如:
java.util.Collections.*
:允许反序列化java.util.Collections
包下的所有类!org.apache.commons.collections.functors.InvokerTransformer
:禁止反序列化InvokerTransformer
这个类*
:默认值,表示允许所有类;
:用于分隔多个规则
- 编程控制:开发者可以在自己的代码中,通过
ObjectInputStream
类提供的setObjectInputFilter()
方法,在运行时为特定的反序列化流设置一个临时的过滤器。这使得开发者可以根据自己的业务需求,对反序列化进行更精细的控制