类型注册与安全性
本 页介绍类型注册机制和安全配置。
类型注册
在严格模式下,只有已注册的类型才能被反序列化。这可以防止任意代码执行:
import pyfory
# 严格模式(生产环境推荐)
f = pyfory.Fory(strict=True)
class SafeClass:
def __init__(self, data):
self.data = data
# 在严格模式下必须注册类型
f.register(SafeClass, typename="com.example.SafeClass")
# 现在序列化可以正常工作
obj = SafeClass("safe data")
data = f.serialize(obj)
result = f.deserialize(data)
# 未注册的类型将引发异常
class UnsafeClass:
pass
# 在严格模式下这将失败
try:
f.serialize(UnsafeClass())
except Exception as e:
print("安全保护已激活!")
注册模式
模式 1:简单注册
fory.register(MyClass, type_id=100)
模式 2:使用类型名称的跨语言注册
fory.register(MyClass, typename="com.example.MyClass")
模式 3:使用自定义序列化器
fory.register(MyClass, type_id=100, serializer=MySerializer(fory, MyClass))
模式 4:批量注册
type_id = 100
for model_class in [User, Order, Product, Invoice]:
fory.register(model_class, type_id=type_id)
type_id += 1
安全模式
严格模式(推荐)
# 生产环境始终使用 strict=True
fory = pyfory.Fory(strict=True)
# 显式注册允许的类型
fory.register(UserModel, type_id=100)
fory.register(OrderModel, type_id=101)
非严格模式
⚠️ 安全警告:当 strict=False 时,Fory 将反序列化任意类型,如果数据来自不受信任的源,这可能带来安全风险。仅在完全信任数据源的受控环境中使用 strict=False。
# 仅在受信任的环境中
fory = pyfory.Fory(xlang=False, ref=True, strict=False)
如果确实需要使用 strict=False,请配置 DeserializationPolicy:
from pyfory import DeserializationPolicy
class SafePolicy(DeserializationPolicy):
def validate_class(self, cls, is_local, **kwargs):
# 阻止危险模块
if cls.__module__ in {'subprocess', 'os', '__builtin__'}:
raise ValueError(f"已阻止:{cls}")
return None
fory = pyfory.Fory(xlang=False, strict=False, policy=SafePolicy())
最大深度保护
限制反序列化深度以防止栈溢出攻击:
fory = pyfory.Fory(
strict=True,
max_depth=100 # 根据数据结构深度调整
)
最佳实践
- 生产环境始终使用
strict=True - 使用
type_id提高性能,使用typename提高灵活性 - 在任何序列化之前预先注册所有类型
- 根据数据结构设置适当的
max_depth - 必要时使用
DeserializationPolicy当需要strict=False时