登录成功后必须调用 session_regenerate_id() 或等效操作,否则易遭 Session Fixation 攻击;需同时启用 HttpOnly、Secure 和 SameSite(Lax/Strict);禁用 URL 传会话 ID;敏感操作须二次验证。

登录成功后必须调用 session_regenerate_id() 或等效操作
Flask、Django、CherryPy 等框架默认不会在用户认证后自动更换会话 ID。攻击者若提前获取了未登录状态下的会话 Cookie(比如通过钓鱼链接或 URL 参数注入),登录后仍可复用该 ID 继续冒充用户——这就是典型的 Session Fixation。
正确做法是在密码校验通过、session 写入用户身份信息前,强制刷新会话标识:
- Flask:使用
session.clear()+session.permanent = True并配合app.config['SECRET_KEY']保证新 session 生效;更稳妥的是手动销毁旧 session 并新建,例如调用flask.session.pop('_id', None)后重新生成 - Django:直接调用
request.session.cycle_key()(Django ≥ 4.2)或request.session.create()+request.session.flush() - CherryPy:启用
'tools.sessions.storage_class': 'cherrypy.lib.sessions.RamSession'后,在登录逻辑中调用cherrypy.session.regenerate()
注意:不能只改 session['user_id'] 值而不换 ID —— 这等于把新钥匙塞进旧锁孔,攻击者仍能开门。
HttpOnly 和 Secure 必须同时开启,且 SameSite 设为 Lax 或 Strict
仅设 HttpOnly 不足以防劫持。如果 Cookie 被 XSS 窃取,但传输过程未加密(HTTP),攻击者拿到的仍是明文会话 ID;反之,若开了 Secure 却没设 HttpOnly,XSS 仍可读取并转发该 Cookie。
立即学习“Python免费学习笔记(深入)”;
CherryPy 示例配置中已体现最佳组合:
cherrypy.config.update({
'tools.sessions.secure': True,
'tools.sessions.httponly': True,
'tools.sessions.samesite': 'Lax',
'tools.sessions.timeout': 30
})
Flask 中需额外设置响应头:
response.set_cookie('session', value, httponly=True, secure=True, samesite='Lax')
遗漏任一参数都可能导致防御失效:比如 samesite=None 会允许跨站携带 Cookie,为 CSRF+Session 劫持提供温床。
使用 Playwright 为 jimeng.jianying.com 管理浏览器会话,导入 cookies/localStorage 以自动化视频生成工作流,支持图片上传等功能
避免在 URL 中传递会话 ID,尤其禁用 PHPSESSID 类参数式会话
某些老项目或调试模式下会把会话 ID 拼在 URL 后,如 /dashboard?PHPSESSID=abc123。这会导致会话 ID 泄露到 Referer、服务器日志、代理缓存甚至浏览器历史记录中。
修复要点:
- 确认 Web 服务器(Nginx/Apache)未开启
session.use_trans_sid(PHP)或类似透传机制 - 检查 Python 应用是否误用了
requests.Session()的params携带会话 ID —— 爬虫代码常犯此错,但服务端绝不应接受 URL 中的 session 参数 - 对所有入口路由做拦截,拒绝含
sid=、sessionid=、PHPSESSID=等参数的 GET 请求(除非是 OAuth callback 等明确例外)
一旦发现 URL 中存在会话标识,说明整个会话生命周期已暴露在非加密通道下,必须立即轮换密钥并通知用户重置凭证。
敏感操作必须二次验证会话绑定属性
仅靠会话 ID 有效性不足以证明当前请求来自合法用户。攻击者可能已劫持会话,但尚未触发关键行为(如转账、改密)。此时应叠加设备指纹或登录态一致性校验。
可行方案包括:
- 比对
request.headers.get('User-Agent')与登录时存储的哈希值(注意 User-Agent 可被伪造,仅作辅助) - 记录首次登录 IP 的 CIDR 前缀(如
192.168.1.0/24),后续敏感请求若超出该范围则要求短信验证 - 对修改密码、绑定手机等操作,强制要求输入当前密码或提供 TOTP 动态码 —— 不能仅依赖 session 存在就放行
这类校验容易被跳过,因为开发时总想“简化流程”。但真实攻防中,90% 的高危操作漏洞都源于此处松动。
会话劫持不是“有没有 Cookie”的问题,而是“谁控制了这个 Cookie 的生命周期”。从登录那一刻起,ID 就不该再被复用,也不该离开安全信道,更不该脱离上下文独立生效。

















