代码对比
✕ Java 8
// Dangerous: accepts any class
ObjectInputStream ois =
new ObjectInputStream(input);
Object obj = ois.readObject();
// deserialization attacks possible!
✓ Java 9+
ObjectInputFilter filter =
ObjectInputFilter.Config
.createFilter(
"com.myapp.*;!*"
);
ois.setObjectInputFilter(filter);
Object obj = ois.readObject();
发现此代码有问题? 告诉我们。
为什么现代方式更好
安全性
防止反序列化意外或恶意的类。
粒度控制
按类名、包、深度和大小过滤。
全局或每流
在 JVM 级别或每个 ObjectInputStream 设置过滤器。
旧方式
接受所有内容
现代方式
ObjectInputFilter
自 JDK
9
难度
高级
JDK 支持
反序列化过滤器
可用
自 JDK 9 起广泛可用(2017 年 9 月)
工作原理
ObjectInputFilter 允许您对类进行白名单/黑名单管理,限制对象图深度、数组大小和总字节数。这保护应用程序免受反序列化攻击。
相关文档