PHP会话劫持预防的核心是切断攻击者获取、预测或复用Session ID的路径,同时加固会话数据本身的安全边界:强制启用HttpOnly和Secure标志阻断XSS窃取;登录后立即调用session_regenerate_id(true)防止会话固定;开启use_strict_mode拒绝未注册SID;缩短gc_maxlifetime并关闭trans_sid;将session_save_path移出Web根目录且设700权限。

PHP会话劫持预防的核心是切断攻击者获取、预测或复用Session ID的路径,同时加固会话数据本身的安全边界。单纯依赖默认配置极易被利用,必须主动设置关键安全参数并配合业务逻辑做防御。
强制启用HttpOnly和Secure标志
这是阻断XSS窃取Session ID最直接有效的手段。HttpOnly可防止JavaScript读取cookie,Secure确保cookie只在HTTPS下传输,避免明文暴露。
- 在php.ini中设置:
session.cookie_httponly = 1
session.cookie_secure = 1 - 或运行时动态配置:
ini_set('session.cookie_httponly', 1);
ini_set('session.cookie_secure', 1); - 若部署在HTTP环境但暂未启用HTTPS,务必先升级协议——否则Secure设为true会导致Cookie无法发送,用户反复登出
登录后立即重生成Session ID
防止会话固定(Session Fixation)攻击。攻击者常诱导用户访问带预设SID的登录链接,一旦登录成功,该SID即被绑定到高权限账户。
- 调用session_regenerate_id(true)销毁旧会话文件并生成新ID
- 必须在用户身份确认后(如密码验证通过)、写入认证状态前执行
- 避免仅在登录页生成新ID却未清空原会话,否则攻击者仍可凭旧SID访问
启用严格会话模式与合理超时
让服务器拒绝任何未经创建就直接提交的Session ID,同时缩短有效窗口,降低被利用概率。
立即学习“PHP免费学习笔记(深入)”;
- 开启严格模式:ini_set('session.use_strict_mode', 1),阻止攻击者构造合法格式但未注册的SID
- 缩短生命周期:ini_set('session.gc_maxlifetime', 1800)(30分钟),避免长期存活的会话成为目标
- 结合业务设定更细粒度超时,例如后台管理页闲置5分钟自动登出,需前端定时触发心跳或服务端检查最后活动时间
关闭透明化Session传递与隐藏存储路径
防止Session ID通过URL泄露,也避免攻击者通过目录遍历读取原始会话文件。
- 禁用URL传递:ini_set('session.use_trans_sid', 0),杜绝?PHPSESSID=xxx出现在地址栏
- 修改会话保存路径:session_save_path('/var/tmp/php_sessions'),确保该目录不在Web可访问范围内(如不位于/public_html或/www下)
- 限制目录权限:chmod 700 /var/tmp/php_sessions,仅允许Web服务器用户读写



















