PHP 7.4虽未新增会话劫持防护机制,但完全支持三项强制Cookie安全标志(HttpOnly、Secure、use_strict_mode)、登录后必须调用session_regenerate_id(true),并需规避输出前置导致session_start()失败等关键实践。

PHP 7.4 本身不新增会话劫持防护机制,但所有关键防御手段在该版本下完全可用且更稳定——前提是配置正确、调用时机合理,否则哪怕用了 session_regenerate_id() 也形同虚设。
必须启用的三项 Cookie 安全标志
会话劫持最常见入口是明文传输或 JS 可读的 Cookie。PHP 7.4 默认仍允许不安全的会话 Cookie,必须显式开启:
-
session.cookie_httponly = 1:阻止 JavaScript 通过document.cookie读取PHPSESSID,直接封死 XSS 窃取路径 -
session.cookie_secure = 1:强制仅通过 HTTPS 发送 Cookie,避免中间人嗅探(注意:开发环境若无 HTTPS,此值需设为 0,但上线前必须改回 1) -
session.use_strict_mode = 1:拒绝客户端传入未注册过的会话 ID,大幅降低会话固定攻击成功率
这些配置建议写在 php.ini 中,或在脚本开头用 ini_set() 设置(但需确保在 session_start() 前执行)。
登录后必须调用 session_regenerate_id(true)
会话固定攻击的核心在于“登录前后 Session ID 不变”。PHP 7.4 的 session_regenerate_id(true) 能彻底销毁旧会话文件并生成新 ID,是防御该攻击的刚性要求。
立即学习“PHP免费学习笔记(深入)”;
- 必须在用户身份确认后立即调用,比如密码校验成功、
$_SESSION['logged_in'] = true之后 - 参数
true表示删除旧会话存储(关键!不加这个参数,旧文件仍存在,攻击者可继续使用) - 不要在登录表单页或未认证状态下调用,否则会清空访客已有会话数据(如购物车)
示例片段:
if ($valid_login) {
session_regenerate_id(true);
$_SESSION['user_id'] = $uid;
$_SESSION['logged_in'] = true;
}
避免会话文件暴露和预测风险
PHP 7.4 默认仍将 session 存在系统临时目录(如 /tmp),若 Web 根目录权限不当,可能被直接下载;同时弱随机数可能导致 SID 可预测。
- 修改
session.save_path到 Web 根目录外的私有路径,例如/var/php-sessions,并设权限为700 - 确认
session.entropy_file指向有效熵源(如/dev/urandom),或启用session.sid_bits_per_character = 6提升 SID 随机性 - 生产环境禁用
session.hash_function的弱哈希(如 md5),推荐保持默认的sha256
这些不是“锦上添花”,而是防止攻击者绕过 Cookie 防护、直接扫描或猜解会话文件的底层防线。
真正容易被忽略的是:所有这些设置都依赖于 session_start() 的调用时机。只要页面顶部有任何输出(包括 UTF-8 BOM、空格、echo、HTML),session_start() 就会失败,后续所有安全配置都成空谈——这不是 PHP 7.4 特有,却是绝大多数线上事故的起点。



















