PHP7.1运行正常的sec_session代码升级到PHP7.3后无法启动安全会话是什么原因?
故障原因
- 核心原因是PHP 7.2及以上版本调整了
session.use_only_cookies配置项的可修改权限,从原来的PHP_INI_ALL改为PHP_INI_PERDIR,仅允许在php.ini、httpd.conf或.htaccess文件中修改,不支持在业务代码中通过ini_set()函数动态修改。你的代码中尝试用ini_set()修改该配置时会直接返回false,触发预设的错误跳转逻辑。 - 次要可能性为PHP开启了
session.auto_start配置,会话在代码执行前已经自动启动,此时修改会话相关配置也会失败。
解决方案
按以下优先级调整即可:
- 首先修改php.ini配置文件,确认
session.use_only_cookies = 1、session.auto_start = 0,保存后重启PHP服务。这两个是会话安全的标准配置,无需在代码中动态调整。 - 调整
sec_session_start函数中的判断逻辑,删除原有的ini_set修改及返回值判断,改为直接读取配置校验即可:
function sec_session_start() { $session_name = 'sec_session_id'; // Set a custom session name $secure = SECURE; // This stops JavaScript being able to access the session id. $httponly = true; // 仅校验配置是否符合要求,不尝试动态修改 if (ini_get('session.use_only_cookies') != 1) { header("Location: ../error.php?err=Could not initiate a safe session (ini_set)"); exit(); } // 以下原有逻辑保持不变 $cookieParams = session_get_cookie_params(); session_set_cookie_params($cookieParams["lifetime"], $cookieParams["path"], $cookieParams["domain"], $secure, $httponly); session_name($session_name); session_start(); session_regenerate_id(); }
- 额外确认调用
sec_session_start()函数前没有任何输出内容(包括空格、HTML片段、BOM头、提前输出的调试内容等),避免会话启动失败。
内容的提问来源于stack exchange,提问作者Xhulio Berberi
相关产品推荐
相关产品推荐

