为什么PHP不使用Internet Explorer为特定用户保存会话变量?

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个测试页都是相同的.

有人知道这可能是什么吗?据我所知,有问题的代码工作了好几年,问题在上个月左右开始显现.

编辑

评论中的问题答案:

  • 我无法在本地计算机上复制问题.
  • 我有IE7和IE9用户的问题报告.但我不能肯定地说其他版本没有问题,因为它们可能还没有被报道.
  • 有问题的用户的浏览器没有禁用cookie,PHPSESSID cookie被发送到服务器.
  • 机器名称中没有 - 或_(/sf/answers/21462101/).
  • 使用session_regenerate_id()重新生成会话ID不会影响有问题的用户的结果.
  • 有问题的用户的时区和时间设置与服务器上的相同.

编辑2

正如@ n​​l-x在注释中所述,数据存储在第二个请求中.所以我调整了测试场景并添加了另一个步骤来查看会话是否适用于后续请求.情况就是这样.会话数据设置在请求之间step2.phpstep3.php保存.

所以现在问题是为什么第一个请求的会话数据丢失而后续请求没有丢失?

Jan*_*enk 5

我发现有问题的用户都安装了Chrome Frame.我通过在本地计算机上安装Chrome Frame来验证这一点,在这种情况下,我能够复制问题.

问题是由于我们的服务器安装了Suhosin.启用了以下Suhosin设置:

suhosin.session.cryptua
suhosin.cookie.cryptua
Run Code Online (Sandbox Code Playgroud)

这意味着用户代理字符串也是用户会话标识的一部分.通常这不是问题,但对于安装了Chrome框架的用户,第一个请求和后续请求之间的用户代理字符串不同.禁用这些Suhosin设置后,没有更多问题.