gpt4 book ai didi

php - 为什么 PHP 不为特定用户使用 Internet Explorer 保存 session 变量?

转载 作者:可可西里 更新时间:2023-10-31 22:14:30 25 4
gpt4 key购买 nike

我的网站出现问题,PHP 不为使用 Internet Explorer 的特定用户保存 session 变量。但对于其他一些使用 Internet Explorer 的用户来说完全没有问题,使用其他浏览器的用户也没有任何问题。

我创建了以下三个小脚本以确保网站中没有涉及其他代码:

测试.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>

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>

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);

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)
}

但是,有问题的用户的输出如下:

array(0) {
}

array(0) {
}

array(1) {
["count"] => int(1)
}

这意味着不会为这些用户存储 session 变量。但是,对于所有 3 个测试页面,有问题的用户的 session ID 都是相同的。

有人知道这是什么吗?据我所知,有问题的代码已经运行了好几年,问题在上个月左右开始显现。

编辑

评论中问题的答案:

  • 我无法在本地机器上重现该问题。
  • 我收到了 IE7 和 IE9 用户的问题报告。但我不能肯定地说其他版本没有问题,因为可能只是还没有报告这些问题。
  • 有问题的用户的浏览器没有禁用 cookie,PHPSESSID cookie 被发送到服务器。
  • 机器名称 ( https://stackoverflow.com/a/306601/534109 ) 中没有 - 或 _。
  • 使用 session_regenerate_id() 重新生成 session ID 对有问题的用户的结果没有影响。
  • 出现问题的用户的时区和时间设置与服务器上的相同。

编辑2

如@nl-x 在评论中所述,数据存储在第二个请求中。所以我调整了测试场景并添加了另一个步骤来查看 session 是否适用于后续请求。就是这样。 step2.phpstep3.php 中的 session 数据集在请求之间保存。

那么现在的问题是,为什么第一次请求的 session 数据会丢失,而后续请求不会丢失?

最佳答案

我发现遇到问题的用户都安装了 Chrome 内嵌框架。我通过在本地计算机上安装 Chrome Frame 验证了这一点,在这种情况下我能够重现问题。

问题是因为我们的服务器安装了Suhosin。已启用以下 Suhosin 设置:

suhosin.session.cryptua
suhosin.cookie.cryptua

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

关于php - 为什么 PHP 不为特定用户使用 Internet Explorer 保存 session 变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16808758/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com