Python Pickle 反序列化

作者:HDdss(代放)

一、Python 基础语法

1.1 变量定义与数据类型

1
2
3
4
5
6
# 基本数据类型
name = "Alice" # 字符串(str)
age = 20 # 整数(int)
score = 95.5 # 浮点数(float)
is_student = True # 布尔值(bool)
empty = None # 空值(NoneType)

1.2 列表(List)

1
2
3
4
fruits = ["apple", "banana", "orange"]
fruits.append("grape")
fruits.remove("banana")
print(fruits[0], fruits[-1])

1.3 元组(Tuple)

1
2
3
coords = (10, 20)
x, y = coords
print(x, y)

1.4 字典(Dictionary)

1
2
3
user = {"name": "Alice", "age": 20}
print(user["name"])
user["role"] = "student"

二、什么是序列化与反序列化

  • 序列化:把对象转成可存储或可传输的字节流。
  • 反序列化:把字节流还原为对象。

在 Python 中,pickle 是常见的序列化模块,但它并不是“安全数据格式”。

三、pickle 反序列化风险

pickle.loads() 在反序列化时可以触发对象的构造与方法调用。如果输入数据可控,攻击者可能构造恶意 payload,实现任意代码执行。

高风险场景

  • 从用户上传内容中直接 pickle.loads()
  • 从不可信网络来源读取 pickle 数据
  • 在 Web 接口中对参数直接反序列化

四、安全建议

  • 不要反序列化不可信数据。
  • 优先使用 JSON 等安全格式进行跨系统传输。
  • 如必须使用 pickle,至少要保证数据来源可信、传输链路完整,并增加签名校验。

五、总结

pickle 功能强大,但安全边界非常明确:它适合可信环境下的对象持久化,不适合处理外部不可信输入。