session,cookie认证会话中的安全问题
字数 1789 2025-08-26 22:11:22
Session与Cookie认证会话安全教学文档
1. 会话概念与必要性
1.1 HTTP协议的无状态性
- HTTP协议是无状态的,每个请求独立,服务器无法识别连续请求之间的关系
- 需要身份认证机制来区分不同用户并授予相应权限
1.2 会话的作用
- 基于TCP三次握手建立连接
- 在HTTP1.1中,一个连接通常只能处理一个请求
- 会话凭证使服务器能识别连续请求来自同一用户
- 会话让服务器在交互过程中持续识别用户身份
2. PHP中的Session机制
2.1 Session工作流程
-
session_start()调用后:- 服务器响应头返回
Set-Cookie:PHPSESSID=xxxxxxx - 浏览器创建对应cookie并关联域名
- 服务器端创建以Session ID命名的文件
- 服务器响应头返回
-
登录前:
- Session ID已分配但服务端session文件内容为空
-
登录后:
- 服务端用PHPSESSID创建包含用户信息的文件
- 后续请求携带此PHPSESSID时,服务器查找并验证用户信息
2.2 Session存储
- 服务器端:
sess_...命名的文件存储序列化的用户信息 - 客户端:PHPSESSID通常存储在cookie中
3. Session劫持攻击
3.1 Session劫持条件
- 目标平台使用session进行身份认证
- 用户已登录并获得有效sessionid
- 攻击者获取sessionid并在有效期内使用
3.2 Session ID获取方式
-
劫持方式:
- XSS攻击
- 局域网嗅探
- 会话固定
- 任意文件读取漏洞
-
爆破方式:
- 直接爆破sessionid(成功率极低)
- 分析session生成规则进行预测
3.3 PHP Session ID生成规则
基于以下参数通过hash_func散列生成:
- 客户端IP
- 当前时间(秒)
- 当前时间(微秒)
- PHP随机数生成器
4. 会话固定攻击
4.1 攻击流程
- 攻击者构造固定sessionid(通过URL或表单)
- 诱导用户使用此sessionid登录
- 用户登录后,攻击者使用预设sessionid登录
4.2 Session ID固定方法
-
通过XSS设置cookie:
document.cookie="sessionid=test123" -
通过URL传递:
www.example.com?sessionid=test123 -
通过HTTP响应头设置:
<meta http-equiv='Set-Cookie' content='PHPSESSID=22333'>
4.3 示例攻击代码
<html>
<body>
<form action="http://127.0.0.1/login.php" method="POST">
用户名称:<input type="text" name="zhanghao">
用户密码:<input type="password" name="mima">
<input type="submit" value="Submit request" />
<meta http-equiv='Set-Cookie' content='PHPSESSID=22333'>
</form>
<script type='text/javascript'>
document.cookie='PHPSESSID=123456789'
</script>
</body>
</html>
5. Cookie安全问题
5.1 Cookie与Session对比
| 特性 | Session | Cookie |
|---|---|---|
| 存储位置 | 服务器端 | 客户端 |
| 过期机制 | 需显式设置过期时间 | 浏览器关闭时默认销毁 |
| 服务器负载 | 高(存储所有用户session) | 低 |
5.2 Cookie安全隐患
-
信息泄露:
- 存储用户身份ID、浏览记录、手机号等敏感信息
- 通常以明文传输,易被截获
-
越权漏洞:
- 通过修改cookie中的userid等参数实现越权
- 缺乏多重认证时易发生平行越权
5.3 典型攻击场景
- XSS攻击获取cookie
- Cookie中敏感信息未加密
- 接口ID参数设置不当导致信息泄露
6. 防御措施
6.1 Session安全防护
- 使用
session.use_only_cookies选项限制仅通过cookie传递sessionid - 及时销毁过期session
- 对重要操作进行重新认证
- 使用HTTPS加密传输sessionid
6.2 防会话固定
- 用户登录后重置sessionid
- 避免接受外部提供的sessionid
- 检查Referer头防止CSRF
6.3 Cookie安全增强
- 设置HttpOnly标志防止XSS窃取
- 设置Secure标志仅通过HTTPS传输
- 合理设置Domain和Path范围
- 对敏感信息加密存储
7. 最佳实践
- 关键操作使用Session而非Cookie存储状态
- 实现Session超时自动销毁机制
- 记录Session活动日志用于审计
- 对用户输入进行严格过滤防止XSS
- 定期进行安全测试和代码审计