Jan*_*enk 11 php session internet-explorer
我的网站存在问题,PHP无法使用Internet Explorer为特定用户保存会话变量.但对于其他一些使用Internet Explorer的用户来说根本没有问题,而使用其他浏览器的用户也没有任何问题.
我创建了以下三个小脚本,以确保不涉及网站中的其他代码:
test.php的:
<?php
session_start();
function logMsg($text) {
$filename = dirname(__FILE__) . "/test.log";
$fh = fopen($filename, "a") or die("Could not open log file.");
fwrite($fh, date("d-m-Y, H:i")." - $text\n") or die("Could not write file!");
fclose($fh);
}
ob_start();
var_dump(session_id(), $_SESSION, $_SERVER, $_REQUEST);
$content = ob_get_clean();
logMsg("test.php");
logMsg($content);
$_SESSION['test'] = array('test' => 'lalala');
$_SESSION['count'] = 1;
?>
<a href="test2.php">Next</a>
Run Code Online (Sandbox Code Playgroud)
test2.php:
<?php
session_start();
function logMsg($text) {
$filename = dirname(__FILE__) . "/test.log";
$fh = fopen($filename, "a") or die("Could not open log file.");
fwrite($fh, date("d-m-Y, H:i")." - $text\n") or die("Could not write file!");
fclose($fh);
}
ob_start();
var_dump(session_id(), $_SESSION, $_SERVER, $_REQUEST);
$content = ob_get_clean();
logMsg("test2.php");
logMsg($content);
$_SESSION['count']++;
?>
<a href="test3.php">Next</a>
Run Code Online (Sandbox Code Playgroud)
test3.php:
<?php
session_start();
function logMsg($text) {
$filename = dirname(__FILE__) . "/test.log";
$fh = fopen($filename, "a") or die("Could not open log file.");
fwrite($fh, date("d-m-Y, H:i")." - $text\n") or die("Could not write file!");
fclose($fh);
}
ob_start();
var_dump(session_id(), $_SESSION, $_SERVER, $_REQUEST);
$content = ob_get_clean();
logMsg("test3.php");
logMsg($content);
Run Code Online (Sandbox Code Playgroud)
预期的输出var_dump($_SESSION)将是这样的:
array(0) {
}
array(2) {
["test"] => array(1) {
["test"] => string(6) "lalala"
},
["count"] => int(1)
}
array(2) {
["test"] => array(1) {
["test"] => string(6) "lalala"
},
["count"] => int(2)
}
Run Code Online (Sandbox Code Playgroud)
但是,有问题的用户的输出如下:
array(0) {
}
array(0) {
}
array(1) {
["count"] => int(1)
}
Run Code Online (Sandbox Code Playgroud)
这意味着不会为这些用户存储会话变量.但是,有问题的用户的会话ID对于所有3个测试页都是相同的.
有人知道这可能是什么吗?据我所知,有问题的代码工作了好几年,问题在上个月左右开始显现.
编辑
评论中的问题答案:
编辑2
正如@ nl-x在注释中所述,数据存储在第二个请求中.所以我调整了测试场景并添加了另一个步骤来查看会话是否适用于后续请求.情况就是这样.会话数据设置在请求之间step2.php并step3.php保存.
所以现在问题是为什么第一个请求的会话数据丢失而后续请求没有丢失?
我发现有问题的用户都安装了Chrome Frame.我通过在本地计算机上安装Chrome Frame来验证这一点,在这种情况下,我能够复制问题.
问题是由于我们的服务器安装了Suhosin.启用了以下Suhosin设置:
suhosin.session.cryptua
suhosin.cookie.cryptua
Run Code Online (Sandbox Code Playgroud)
这意味着用户代理字符串也是用户会话标识的一部分.通常这不是问题,但对于安装了Chrome框架的用户,第一个请求和后续请求之间的用户代理字符串不同.禁用这些Suhosin设置后,没有更多问题.
| 归档时间: |
|
| 查看次数: |
2117 次 |
| 最近记录: |