我正在尝试确保用户在网站上的会话安全。 在登录流程中,我正在重新生成会话ID,以确保在会话固定方面更好的安全性(减少猜测的机会)。我正在尝试为session_regenerate_id()的工作测试一个脚本。它有两个实例。它们是:session_regenerate_id()如何在内部工作?
/var/www/public/goto/index.php:31:int 0
/var/www/public/goto/index.php:32:string 'q96btv7i1ukpb3cq8tskcgdeb7' (length=26)
在另一个选项卡(同一浏览器):
1)通过使用session_regenerate_id(真)
<?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 1 /var/www/public/goto/index.php:32:string 'gspq91o1jbcrcc27b4fkm4qgd5' (length=26)
在打开另一个选项卡中的相同页面后检查文件夹时,会话fil ES存储,我发现只有与字符串相关的会议文件:gspq91o1jbcrcc27b4fkm4qgd5
2)刚再生新的会话ID使用session_regenerate_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
作为输出?
即使选项卡1不知道再生和新会话cookie,同一个会话仍然如何保持?
当我刷新标签页1 而不是的页面时,请不要请求新生成的会话(在标签2上)?
这将在同一个浏览器上进行两个会话,而实际上并不是这样。如何PHP处理这对session_regenerate_id(true)
浏览器处理cookie,当服务器生成一个新的会话ID时,服务器发回一个新的cookie,浏览器接受cookie(或不是,取决于浏览器的设置),当你发出新的请求时,浏览器发回新的cookie。 –
此外,如果您使用缓存,则浏览器可以在缓存中使用其Cookie,而不是使用新的Cookie。重新生成会话时,尝试使用CTRL + R来刷新而不使用缓存。 – AnthonyB
@AnthonyB有趣的一点。我从来没有遇到过使用缓存中的cookie的浏览器,但我会深入研究这一点。 –