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工作流程

  1. session_start()调用后:

    • 服务器响应头返回Set-Cookie:PHPSESSID=xxxxxxx
    • 浏览器创建对应cookie并关联域名
    • 服务器端创建以Session ID命名的文件
  2. 登录前:

    • Session ID已分配但服务端session文件内容为空
  3. 登录后:

    • 服务端用PHPSESSID创建包含用户信息的文件
    • 后续请求携带此PHPSESSID时,服务器查找并验证用户信息

2.2 Session存储

  • 服务器端:sess_...命名的文件存储序列化的用户信息
  • 客户端:PHPSESSID通常存储在cookie中

3. Session劫持攻击

3.1 Session劫持条件

  1. 目标平台使用session进行身份认证
  2. 用户已登录并获得有效sessionid
  3. 攻击者获取sessionid并在有效期内使用

3.2 Session ID获取方式

  1. 劫持方式

    • XSS攻击
    • 局域网嗅探
    • 会话固定
    • 任意文件读取漏洞
  2. 爆破方式

    • 直接爆破sessionid(成功率极低)
    • 分析session生成规则进行预测

3.3 PHP Session ID生成规则

基于以下参数通过hash_func散列生成:

  • 客户端IP
  • 当前时间(秒)
  • 当前时间(微秒)
  • PHP随机数生成器

4. 会话固定攻击

4.1 攻击流程

  1. 攻击者构造固定sessionid(通过URL或表单)
  2. 诱导用户使用此sessionid登录
  3. 用户登录后,攻击者使用预设sessionid登录

4.2 Session ID固定方法

  1. 通过XSS设置cookie:

    document.cookie="sessionid=test123"
    
  2. 通过URL传递:

    www.example.com?sessionid=test123
    
  3. 通过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安全隐患

  1. 信息泄露

    • 存储用户身份ID、浏览记录、手机号等敏感信息
    • 通常以明文传输,易被截获
  2. 越权漏洞

    • 通过修改cookie中的userid等参数实现越权
    • 缺乏多重认证时易发生平行越权

5.3 典型攻击场景

  • XSS攻击获取cookie
  • Cookie中敏感信息未加密
  • 接口ID参数设置不当导致信息泄露

6. 防御措施

6.1 Session安全防护

  1. 使用session.use_only_cookies选项限制仅通过cookie传递sessionid
  2. 及时销毁过期session
  3. 对重要操作进行重新认证
  4. 使用HTTPS加密传输sessionid

6.2 防会话固定

  1. 用户登录后重置sessionid
  2. 避免接受外部提供的sessionid
  3. 检查Referer头防止CSRF

6.3 Cookie安全增强

  1. 设置HttpOnly标志防止XSS窃取
  2. 设置Secure标志仅通过HTTPS传输
  3. 合理设置Domain和Path范围
  4. 对敏感信息加密存储

7. 最佳实践

  1. 关键操作使用Session而非Cookie存储状态
  2. 实现Session超时自动销毁机制
  3. 记录Session活动日志用于审计
  4. 对用户输入进行严格过滤防止XSS
  5. 定期进行安全测试和代码审计
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: 通过URL传递: 通过HTTP响应头设置: 4.3 示例攻击代码 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 定期进行安全测试和代码审计