标准答案
- 不可信数据不能直接 ObjectInputStream 反序列化,应使用允许类型白名单和更安全的协议。
- JSON 可读性好但体积和类型表达有限,Protobuf 等 schema 格式更适合跨服务契约和高效传输。
- 格式选择要考虑兼容演进、未知字段、大小、CPU、审计和语言互操作。
- 输入仍需长度、深度、字段和资源限制,格式安全不等于业务安全。
题目解析
原生 Java 反序列化会根据输入恢复对象图并触发类型相关逻辑,不可信输入可能利用类路径和 gadget 链造成安全问题。即使没有已知漏洞,也要限制类型、大小、深度和执行资源。
跨服务格式应按可演进性、语言互操作、体积、CPU 和审计选择 JSON、Protobuf 等受约束协议,不能因为输入来自内网就跳过验证。格式安全也不等于业务授权安全。
Schema 变更要采用兼容窗口、版本和未知字段策略,历史消息可能被重放。升级前验证旧生产者、新消费者和旧消息恢复,避免发布后无法回放。
常见误区
- 误区:只校验文件扩展名。改正:校验实际格式、长度、嵌套深度、字段和允许类型。
- 误区:把内部网络当成可信输入。改正:所有跨边界输入都要鉴权、验签、限资源和审计。
- 误区:升级 Schema 时直接删除旧字段。改正:先完成兼容迁移和历史消息回放验证,再清理旧字段。