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