安全最佳实践
本页介绍安 全最佳实践和 DeserializationPolicy。
生产环境配置
除非环境完全可信,否则不要在生产环境中禁用 strict=True:
import pyfory
# 生产环境推荐设置
f = pyfory.Fory(
xlang=False, # 如果需要跨语言支持则为 True
ref=True, # 处理循环引用
strict=True, # 重要:防止恶意数据
max_depth=100 # 防止深度递归攻击
)
# 显式注册允许的类型
f.register(UserModel, type_id=100)
f.register(OrderModel, type_id=101)
# 永远不要在生产环境中对不受信任的数据设置 strict=False!
开发环境 vs 生产环境
使用环境变量在配置之间切换:
import pyfory
import os
# 开发环境配置
if os.getenv('ENV') == 'development':
fory = pyfory.Fory(
xlang=False,
ref=True,
strict=False, # 开发时允许任何类型
max_depth=1000 # 开发时更高的限制
)
else:
# 生产环境配置(安全加固)
fory = pyfory.Fory(
xlang=False,
ref=True,
strict=True, # 关键:需要注册
max_depth=100 # 合理的限制
)
# 只注册已知的安全类型
for idx, model_class in enumerate([UserModel, ProductModel, OrderModel]):
fory.register(model_class, type_id=100 + idx)
DeserializationPolicy
当需要 strict=False 时(例如,反序列化函数/lambda),使用 DeserializationPolicy 在反序列化期间实现细粒度的安全控制。
为什么使用 DeserializationPolicy?
- 阻止危险的类/模块(例如,
subprocess.Popen) - 在调用前拦截和验证
__reduce__可调用对象 - 在
__setstate__期间清理敏感数据 - 根据自定义规则替换或拒绝反序列化的对象