Python基础(②④序列化和伪造Session)
在 Web 开发里,最常见的序列化格式就是 JSON 字符串
序列化 (serialization) 的本质是: 👉 把内存里的数据结构(比如 Python 的 dict
、Java 的对象、Go 的 struct)转换成一种 可以存储或传输的格式
import jsondata = {"username": "alice", "age": 20}# Python dict
print(type(data), data)
# <class 'dict'> {'username': 'alice', 'age': 20}# 序列化成 JSON 字符串
json_str = json.dumps(data)
print(type(json_str), json_str)
# <class 'str'> {"username": "alice", "age": 20}
{"username": "alice", "age": 20} 在 Python 里是 dict(内存里的哈希表)
{"username": "alice", "age": 20} 变成字符串以后就是 JSON(纯文本)
序列化 ≠ JSON,JSON 只是序列化的一种方式
🔑 Flask Session 的处理流程
Session 数据存储位置(客户端存储型)
序列化 (Serialization)
Flask 会先把 Python 的 dict(比如 {"username": "alice"})转成 JSON 字符串:
{"username": "alice"}
这一步才叫“序列化”:把 Python 对象 → 字符串。
编码 (Encoding)
JSON 字符串再经过 Base64 URL 安全编码,变成一串看似随机的字符:
eyJ1c2VybmFtZSI6ImFsaWNlIn0
签名 (Signing)
Flask 用 secret_key 对上面的 Base64 数据做 HMAC 签名,得到另一段字符串:
aNpq_g.nqxDZhqbLQjD5v3zj3pKCrs9qRo
拼接 (Final Cookie)
最终的 Cookie 值是:
eyJ1c2VybmFtZSI6ImFsaWNlIn0.aNpq_g.nqxDZhqbLQjD5v3zj3pKCrs9qRo
前半部分是序列化+Base64 的数据,后半部分是签名
🔑 Django Session的处理流程
Cookie 里只存一个随机的 sessionid 服务端(数据库/缓存/文件)
用户登录成功后,Django 生成一个随机的 Session ID
这个 ID 存在 Cookie 里:
Set-Cookie: sessionid=abc123xyz; HttpOnly; Path=/
真实的用户数据(如用户名、角色、权限)存储在服务端(默认是数据库 django_session 表)
下次请求时,Django 根据 Cookie 里的 sessionid 去数据库查找对应的数据
👉 所以即使攻击者知道 SECRET_KEY
,也不能直接伪造用户 Session,因为数据不在 Cookie 里,而在服务端