session_regenerate_id()如何在内部工作?

时间:2016-12-18 10:02:46

标签: php session cookies tabs

我正在尝试为网站上的用户保护会话。 在登录流程中,我正在重新生成会话ID,以确保在会话固定方面更好的安全性(减少猜测的机会)。我试图测试session_regenerate_id()的工作脚本。它有两个例子。它们是:
1)使用session_regenerate_id(true)

删除旧会话
<?php
session_start();
if (!isset($_SESSION['times'])) {
    $_SESSION['times'] = 0;
    $_SESSION['generate'] = true;
} else {
    if ($_SESSION['generate'] === true) {
        session_regenerate_id(true);
        $_SESSION['generate'] = false;
    }
    $_SESSION['times']++;
}
var_dump($_SESSION['times']);
var_dump(session_id());
?>

以下是我得到的输出:

/var/www/public/goto/index.php:31:int 0
/var/www/public/goto/index.php:32:string 'q96btv7i1ukpb3cq8tskcgdeb7' (length=26)

在另一个标签页(相同的浏览器)上:

/var/www/public/goto/index.php:31:int 1
/var/www/public/goto/index.php:32:string 'gspq91o1jbcrcc27b4fkm4qgd5' (length=26)

在另一个选项卡中打开相同页面后检查文件夹,其中存储了会话文件,我发现会话文件只与字符串相关联: gspq91o1jbcrcc27b4fkm4qgd5

2)使用session_regenerate_id()重新生成新的会话ID

<?php
session_start();
if (!isset($_SESSION['times'])) {
    $_SESSION['times'] = 0;
    $_SESSION['generate'] = true;
} else {
    if ($_SESSION['generate'] === true) {
        session_regenerate_id();
        $_SESSION['generate'] = false;
    }
    $_SESSION['times']++;
}
var_dump($_SESSION['times']);
var_dump(session_id());
?>

第一个标签的输出:

/var/www/public/goto/index.php:31:int 0
/var/www/public/goto/index.php:32:string 'odu7sttll7pp43suqu22laa755' (length=26)

第二个标签上的输出:

/var/www/public/goto/index.php:31:int 1
/var/www/public/goto/index.php:32:string '27po8j6bu318fd3e69ug4m53i3' (length=26)

在这种情况下,我找到了会话ID的会话文件: odu7sttll7pp43suqu22laa755 27po8j6bu318fd3e69ug4m53i3 因此,功能说的是,它确实如此。 但是,我的问题来了(对于长篇介绍而言),在第一种情况下,当使用session_regenerate_id(true)时,第一个选项卡上的cookie包含旧的会话ID,而新选项卡上的cookie包含新的会话ID。 打开第二个标签后,当我刷新第一个标签时,我神奇地得到3作为输出和第二个标签的session id。 我在这里不明白的是当我刷新Tab 1时,它发送到服务器的cookie包含旧的会话ID,该会话ID不应该不再有效(并且也不作为服务器上的文件存在) ),如何将3作为输出?
即使Tab 1不知道重新生成和新会话cookie,同一会话是如何保持的?如果不是'当我在标签1上刷新页面时的请求让我新生成的会话(在标签2上)?
那将在同一个浏览器上有两个会话,这不是什么实际发生了。 PHP如何在session_regenerate_id(true)

上处理此问题

请注意:以下是我从phpinfo()开始的会话输出 php config

1 个答案:

答案 0 :(得分:0)

谢谢@Charlotte Dunois和@AnthonyB帮助我 这是我的错误。
Chrome Dev Tools似乎无法实时更新Cookie信息。在检查设置上的所有站点数据后,我发现我的域只有一个与之关联的cookie,这是Tab 2的一个。
实际上,当我刷新Tab 1时它确实会发送新的cookie。@AnthonyB说可能会有例外(评论)。

在Dev Tools上,当我为Tab 1关闭它并为Tab 1重新打开它时,我发现Cookies选项卡具有更新的值。我再也看不到旧的cookie值了。

发现,即使Cookie信息发生了变化,Chrome也无法对Cookie进行实时更新(就像在页面元素,样式上一样)。 我认为也不需要这样做 为每个人喝彩。