PHP 8.6 中必须在 php.ini 中设置 session.use_strict_mode = 1 并重启服务器才能可靠启用,ini_set() 无效;其作用是拒绝非法会话 ID,防范会话固定攻击。

session.use_strict_mode = 1 在 PHP 8.6 中的开启方式,和之前版本一致——必须在 php.ini 配置文件中设置,不能仅靠运行时函数(如 ini_set())可靠生效。
✅ 正确开启方法(推荐且稳定)
打开你的 php.ini 文件(可通过 php --ini 或 phpinfo() 查找准确路径),找到或添加这一行:
session.use_strict_mode = 1
确保它不在注释状态(即前面没有分号 ;)。保存后重启 Web 服务器(如 Apache、Nginx + PHP-FPM)或 CLI 环境,使配置生效。
⚠️ 注意:PHP 的 CGI/FastCGI 模式下,
ini_set()对session.use_strict_mode的修改可能被忽略,所以不要依赖ini_set('session.use_strict_mode', '1')—— 它在 PHP 8.6 仍不保证生效。立即学习“PHP免费学习笔记(深入)”;
A powerful memory management system powered by ReMe that provides persistent cross-session memory, automatic user preference application, and intelligent context compression for OpenClaw.下载由 ReMe 驱动的记忆管理系统,支持跨会话记忆持久化、自动应用用户偏好以及智能上下文压缩...
? 为什么必须开?它起什么作用?
- 禁止使用“未初始化”的会话 ID(比如攻击者提前构造
?PHPSESSID=abc123诱骗用户访问)。 - 只接受由 PHP 自己生成并写入存储的 session ID;外部传入的非法/旧 ID 会被拒绝,并自动生成新会话。
- 是防御会话固定(Session Fixation) 的关键配置。
? 建议搭配启用的安全项(同在 php.ini 中设置)
session.use_cookies = 1 session.use_only_cookies = 1 session.cookie_httponly = 1 session.cookie_secure = 1 ; 上线环境必须开(开发若无 HTTPS,可临时设为 0) session.cookie_samesite = Lax session.use_trans_sid = 0
这几项共同构成现代 PHP 会话的基础安全防线。
? 验证是否生效
在脚本中加一段测试代码:
<?php
var_dump(ini_get('session.use_strict_mode')); // 应输出 string(1) "1"
session_start();
// 再用非法 ID 访问(如手动改 URL 加 ?PHPSESSID=test123),应看到新会话 ID 被分配,旧 ID 不延续
echo session_id();
?>如果 ini_get 返回 "1",且非法 ID 无法复用会话,说明已成功启用。
不复杂但容易忽略。



















