集合序列化安全取决于方式与数据来源,禁用pickle处理不可信输入,优先用JSON配合类型校验,敏感场景加签名或加密,Java中禁用不可信ObjectInputStream并用Jackson等替代。

集合类序列化本身不自带安全机制,安全取决于你用什么方式序列化、反序列化,以及数据来源是否可信。
别用 pickle 处理外部集合
Python 的 pickle 能完整保存 list、dict、set 甚至自定义集合类的实例,但它反序列化时会执行任意代码。只要集合里嵌套了恶意构造的对象(比如带特殊 __reduce__ 方法的类),pickle.loads() 就可能触发远程命令执行(RCE)。所以:
- 绝对不要对来自用户输入、API 响应、文件上传、数据库读取(未严格校验)的字节流调用
pickle.loads() - 即使集合看起来“只是数据”,只要它经过 pickle 编码,就不可信
- 内部进程通信若必须用 pickle,请确保两端完全可控、版本一致、网络隔离
优先选 JSON,配合类型预处理
JSON 是最常用也最安全的集合序列化方案,因为它只解析基础数据结构(list、dict、str、int、float、bool、None),不执行任何逻辑。但要注意:
- 原生不支持
set、tuple、datetime、自定义类等——必须提前转成 list 或 dict - 序列化前统一清洗:例如把
set([1,2,3])转为list(set_data);把datetime转为 ISO 字符串 - 反序列化后做类型校验:用
isinstance(data, list)和all(isinstance(x, str) for x in data)确保结构符合预期
需要更强保障时加签名或加密
如果集合数据要落盘或跨服务传递,且需防篡改、防伪造,仅靠 JSON 不够。推荐组合使用:
- 用
json.dumps()序列化集合为字符串 - 用
itsdangerous库签名:生成带 HMAC 的 token,反序列化前先验证签名有效性 - 敏感字段(如用户权限列表)可额外 AES 加密,密钥由服务端安全管理
- 避免自己实现签名逻辑,优先用成熟库保证算法和边界处理正确
Java 集合序列化特别提醒
Java 中直接序列化 ArrayList 或 HashSet(通过 ObjectOutputStream)也有类似 pickle 的风险:反序列化可能触发恶意构造的 readObject()。因此:
- 禁用
ObjectInputStream处理不可信字节流 - 用
JSON-P、Jackson或Gson替代原生序列化 - 若必须用 Java 原生序列化,至少配置白名单过滤器(JDK 9+
ObjectInputFilter)限制可反序列化的类 - 集合本身为空或 null 时,统一返回
Collections.emptyList()等不可变空集合,避免下游判空疏漏引入漏洞


















