我一直试图在网上搜索这个问题的可能答案,但我真的无法弄明白。有很多人有类似的问题,但我有一个独特的触摸,我不明白,我也没有在其他任何地方遇到它。
我创建了一个工作正常的登录系统。但是,我想让它更安全,所以我使用了本教程:http://www.wikihow.com/Create-a-Secure-Login-Script-in-PHP-and-MySQL。我仍然可以登录,但每当我刷新页面时,我都会自动注销。在我发现会话ID发生变化之后。
奇怪的是,当我调用var_dump($ _ SESSION)时;在我的代码的第3行(直接在session_start();)之后,会话ID保持不变,一切正常。一旦我评论这一行,问题就会回来。
我使用以下代码重新生成会话ID:
$session_name = 'robinator123'; // Set a custom session name
$secure = FALSE;
// This stops JavaScript being able to access the session id.
$httponly = true;
// Forces sessions to only use cookies.
if (ini_set('session.use_only_cookies', 1) === FALSE) {
header("Location: ../error.php?err=Could not initiate a safe session (ini_set)");
exit();
}
// Gets current cookies params.
$cookieParams = session_get_cookie_params();
session_set_cookie_params($cookieParams["lifetime"],
$cookieParams["path"],
$cookieParams["domain"],
$secure,
$httponly);
// Sets the session name to the one set above.
session_name($session_name);
session_start(); // Start the PHP session
session_regenerate_id(true); // regenerated the session, delete the old one.
当我调用var_dump($ _ SESSION);时,再生失败,因为var_dump已经发送了头文件。但是,当我用正常的echo语句替换var_dump时,标头也会失败,但会话ID仍会更改。我不知道发生了什么。
一些注意事项:
答案 0 :(得分:0)
我实际上是通过编辑再生代码解决了这个问题。删除再生不起作用,但我通过设置我忘记更改的参数(即生命周期,路径和域),并通过删除参数" true"来修复它。来自session_regenerate_id();命令(我从教程中复制粘贴此代码,并且在进行所有更改时未能注意到这些内容)。
但是,我仍然非常好奇var_dump是如何避免这个问题的。