我一直在尝试在线搜索可能的答案这个问题,但我真的无法弄清楚。有很多人有类似的问题,但我有一个独特的触摸,我不明白,也没有在其他地方遇到过。PHP会话重置刷新
我创建了一个工作正常的登录系统。不过,我想让它更安全,所以我使用了本教程:http://www.wikihow.com/Create-a-Secure-Login-Script-in-PHP-and-MySQL。我仍然可以登录,但每当我刷新页面时,我都会自动注销。过了一段时间后,我发现会话ID发生了变化。
好奇的是,当我调用var_dump($ _ SESSION);在我的代码的第三行(直接在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时,标题也会失败,但会话标识仍然会更改。我不知道发生了什么事。
的几个注意事项:
- 我没有忘记调用session_start();在我的代码开始
- 我用来存储会话变量的包含的php代码位于我的web根目录之外,但是如果我将它们放回到根目录中,问题就不会解决,所以我猜测可以不是问题。
删除'session_regenerate_id(真)'你不想重新生成会话ID。让PHP处理所有会话ID的东西。你应该有一个'$ _SESSION ['myid']'',它保存你想要的数据库项的关键字。 – Tschallacka
谢谢,但根据我提到的教程,重新生成会话ID更安全; “此外,”session_regenerate_id()“函数可在每次重新加载页面时重新生成会话ID,有助于防止会话劫持。”这是真的,还是最好不要再生? –
好吧,看看它这样...用户请求:给我那个页面。您的网站:好的访客aeb123。游客。好吧,我给你。您的网站。哈哈,我会打电话给你。下一个请求。你好网站,im aeb123。您的网站我不知道任何aeb123。我只知道dude123。为了防止会话劫持,请使用长会话ID。他们很难在会议结束前及时暴力破解。如果将一分钟超过100次的请求发送到同一页面,您就可以将这项功能与防洪功能相结合,从而节省用户的体力。 – Tschallacka