类型注册与安全
本页介绍类注册机制和安全配置。
类注册
ForyBuilder#requireClassRegistration 可用于禁用类注册。这将允许反序列化未知类型的对象,这更灵活但如果类包含恶意代码可能不安全。
除非你能确保环境是安全的,否则不要禁用类注册。当禁用此选项时,反序列化未知/不受信任的类型时,init/equals/hashCode 中的恶意代码可能会被执行。
类注册不仅可以降低安全风险,还可以避免类名序列化成本。
按 ID 注册
你可以使用 API Fory#register 注册类:
Fory fory = xxx;
fory.register(SomeClass.class);
fory.register(SomeClass1.class, 1);
注意,类注册顺序很重要。序列化和反序列化端应该具有相同的注册顺序。
按名称注册
按 ID 注册类会有更好的性能和更小的空间开销。但在某些情况下,管理一堆类型 ID 很复杂。在这种情况下,建议使用 API register(Class<?> cls, String namespace, String typeName) 按名称注册类:
fory.register(Foo.class, "demo", "Foo");
如果类 型没有重复的名称,namespace 可以留空以减少序列化大小。
不要使用此 API 注册类,因为与按 ID 注册类相比,它会大大增加序列化大小。
安全配置
类检查器
如果你调用 ForyBuilder#requireClassRegistration(false) 来禁用类注册检查,你可以通过 ClassResolver#setClassChecker 设置 org.apache.fory.resolver.ClassChecker 来控制哪些类允许序列化。
例如,你可以允许以 org.example.* 开头的类:
Fory fory = xxx;
fory.getClassResolver().setClassChecker(
(classResolver, className) -> className.startsWith("org.example."));
AllowListChecker
Fory 提供了 org.apache.fory.resolver.AllowListChecker