跳转到内容

类型元数据与安全边界

Fastjson2 的类型处理同时面对 Java 泛型擦除、JSONB 类型信息和多态对象创建。类型元数据越强,反序列化越灵活;输入边界也因此越需要显式收紧。

先给答案:Fastjson2 的类型处理同时面对 Java 泛型擦除、JSONB 类型信息和多态对象创建

Section titled “先给答案:Fastjson2 的类型处理同时面对 Java 泛型擦除、JSONB 类型信息和多态对象创建”

Fastjson2 的类型处理同时面对 Java 泛型擦除、JSONB 类型信息和多态对象创建。类型元数据越强,反序列化越灵活;输入边界也因此越需要显式收紧。 正文沿“类型信息链 -> 多态与 AutoType -> 类型元数据与性能”展开:先确认入口和状态归属,再跟踪控制流或数据流的推进,最后落到对外可观察的结果。

主要失效边界集中在“反序列化目标类型和 payload 类型信息可能冲突,必须定义优先级和拒绝策略。、仅关闭某一个 AutoType 开关不等于完成安全审计,还要检查自定义 reader、Module 和类型过滤器。、JSONB 适合受控系统内部协议,不应因性能而忽略版本演进和供应链边界。”这些场景。它们破坏的是容量、顺序、并发或生命周期前提;排查时应先确认状态是否仍由正确对象持有,再核对推进条件和清理路径。

Class / Type / TypeReference
↓
TypeUtils / TypeKey
↓
ObjectReaderProvider
↓
concrete ObjectReader

普通 Class 只能表达 raw type;集合和 Map 的元素参数需要 Type、TypeReference 或显式 reader。provider 需要使用足够精确的类型 key,否则不同泛型参数可能错误复用同一个对象 reader。

多态数据需要知道具体子类型。Fastjson2 通过类型信息、注册映射和相关配置完成子类型选择,但“输入中带类名”不等于“可以实例化任意类”。安全配置应限制允许的类型、来源和基类范围。

生产系统应明确区分可信内部 payload 与外部不可信 JSON/JSONB;不要为了兼容历史数据而无条件打开宽泛的自动类型能力。

精确类型可以减少猜测和二次转换,但会增加类型解析、缓存 key 和协议耦合。JSONB 的类型标记也会把 Java 类型语义带入数据格式,跨语言和长期存储场景需要评估兼容性。

替代方案:所有多态对象都由业务字段 kind 显式映射到固定类。

优点:允许列表清晰,协议更容易跨语言。 代价:需要维护映射表,无法自动覆盖任意第三方层次结构。对外部输入,显式映射通常比任意类名解析更容易审计。

  • 反序列化目标类型和 payload 类型信息可能冲突,必须定义优先级和拒绝策略。
  • 仅关闭某一个 AutoType 开关不等于完成安全审计,还要检查自定义 reader、Module 和类型过滤器。
  • JSONB 适合受控系统内部协议,不应因性能而忽略版本演进和供应链边界。

面试锚点

  • 为什么泛型参数会影响 ObjectReader 缓存 key?
  • AutoType 的风险本质是什么?
  • 外部 JSON 和内部 JSONB 的类型信任边界如何不同?