标准答案

  1. 不可信 pickle 可能在加载过程中执行攻击者控制的代码。
  2. 缓存、队列、文件和 HTTP 输入都不能因为来自内网就默认可信。
  3. 选择格式时要考虑类型、兼容、大小、性能和未知字段策略。
  4. 即使格式安全,字段、深度、大小和业务权限仍需校验。

题目解析

pickle 为了恢复 Python 对象可以执行构造逻辑,不可信内容可能导致任意代码执行。内网、缓存、队列和文件都可能被篡改或重放,不能仅靠网络位置建立信任。

跨服务优先使用有 schema 的 JSON、MessagePack 或 Protobuf,并限制大小、深度、字段和版本。签名能验证来源/完整性,不代表业务字段自动合法或有权限。

序列化格式还要考虑语言互操作、未知字段、兼容和重放。高风险操作要验证业务状态和幂等,不因签名通过就直接执行。

常见误区

  • 误区:pickle 只在内部网络使用就不设边界。改正:不反序列化不可信 pickle,使用受约束格式和输入限制。
  • 误区:签名后直接信任业务字段。改正:仍校验权限、状态、时效、金额和幂等。
  • 误区:把 Python 专属对象格式当跨语言契约。改正:选择版本化、可审计和跨语言可解析的 schema。

作者信息