Chrome中PHP会话随机丢失但Firefox正常,原因何在?
我的服务器上有file1.php,用于创建并显示会话变量(我会保持该页面打开):
http://localhost/file1.php 代码:
session_start(); $_SESSION['test'] = "hello"; echo $_SESSION['test'];
我的本地电脑(非服务器)上有file2.html,其表单指向服务器上的file3.php,后者用于显示之前创建的会话变量:
file:///C:/Users/Me/Desktop/file2.html 代码:
<form method="post" action="http://localhost/file3.php"> <input type="submit" >GO </form>
http://localhost/file3.php 代码:
session_start(); echo $_SESSION['test'];
点击file2.html的提交按钮时,Firefox中一切正常,file3.php能正常显示会话变量;但Chrome中显示结果随机,有时PHPSESSID Cookie会被重置,导致会话变量丢失,出现警告:
Warning: Undefined array key "test" in C:\xampp\htdocs\momo\file3.php
请问为何Chrome出现此问题而Firefox正常?
这是Chrome和Firefox对跨源Cookie传递以及file协议安全策略的处理逻辑差异导致的:
SameSite Cookie策略执行严格度不同
Chrome默认对Cookie的SameSite属性执行更严苛的规则。从file://协议的页面提交表单到http://localhost属于跨源请求,若PHP会话Cookie(PHPSESSID)未显式设置SameSite=None和对应属性,Chrome会阻止该Cookie随请求发送,服务器无法识别原有会话,只能创建新会话,因此读取不到$_SESSION['test']。
而Firefox对本地文件到本地服务器的跨源请求宽容度更高,默认允许传递会话Cookie,所以能正常读取变量。file协议的源判定差异
file://属于本地文件协议,不属于标准HTTP源范畴。Chrome将其视为完全独立的源,严格限制它与HTTP源的Cookie交互;Firefox在处理本地文件到本地服务器的请求时,会放宽同源策略限制,允许Cookie正常传递。默认会话Cookie属性的适配差异
PHP默认生成的会话Cookie未设置SameSite属性,在Chrome中会被归类为SameSite=Lax模式,该模式不允许跨站POST请求携带Cookie,这是Chrome会话丢失的核心原因。而Firefox对Lax模式的跨站POST请求处理更宽松,因此无异常。
要让Chrome正常工作,可在session_start()前修改PHP会话Cookie设置:
session_set_cookie_params([ 'lifetime' => 0, 'path' => '/', 'domain' => 'localhost', 'secure' => false, // 若使用HTTPS需设为true 'httponly' => true, 'samesite' => 'None' ]); session_start();
注意:如果是HTTPS环境,secure必须设为true,否则Chrome会拒绝接受SameSite=None的Cookie。
内容的提问来源于stack exchange,提问作者Samvio

