我正在尝试为网站上的用户保护会话。
在登录流程中,我正在重新生成会话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)
答案 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进行实时更新(就像在页面元素,样式上一样)。 我认为也不需要这样做 为每个人喝彩。