PHP会话在刷新时重置

PHP会话在刷新时重置,php,session,Php,Session,我一直试图在网上搜索这个问题的可能答案,但我实在想不出来。有很多人有类似的问题,但我的问题有一个独特的触感,我不理解,我也没有在其他地方遇到过 我创建了一个运行良好的登录系统。但是,我想让它更安全,所以我使用了本教程:。我仍然可以登录,但每当我刷新页面时,我都会自动注销。之后,我发现会话ID发生了变化 奇怪的是,当我调用var_dump($\u SESSION);在我的代码的第三行(直接在session_start()之后),session ID保持不变,一切正常。我一评论这一行,问题就回来了

我一直试图在网上搜索这个问题的可能答案,但我实在想不出来。有很多人有类似的问题,但我的问题有一个独特的触感,我不理解,我也没有在其他地方遇到过

我创建了一个运行良好的登录系统。但是,我想让它更安全,所以我使用了本教程:。我仍然可以登录,但每当我刷新页面时,我都会自动注销。之后,我发现会话ID发生了变化

奇怪的是,当我调用var_dump($\u SESSION);在我的代码的第三行(直接在session_start()之后),session 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_转储发送。但是,当我用普通的echo语句替换var_dump时,头也会失败,但会话ID仍然会更改。我不知道发生了什么事

请注意:

  • 我没有忘记调用session_start();在我的代码的开头
  • 我用来存储会话变量的附带php代码位于我的web根目录之外,但是如果我将它们放回我的根目录中,问题就没有解决,所以我猜这不可能是问题所在
我实际上通过编辑代码片段解决了这个问题。删除重新生成不起作用,但我通过设置忘记更改的参数(即生存期、路径和域)以及从会话_regenate_id()中删除参数“true”来修复它;命令(我从教程中复制粘贴了这段代码,在进行所有更改时没有注意到这些事情)


然而,我仍然很好奇var_dump是如何避免这个问题的

删除
session\u regenerate\u id(true)
您不想重新生成session id。让php处理所有session id内容。您应该拥有一个
$\u会话['myid']
,它持有您想要的数据库项的密钥。谢谢,但根据我参考的教程,重新生成会话ID更安全;“另外,“session_regenate_id()”函数在每次重新加载页面时重新生成会话id,有助于防止会话劫持。”。这是真的,还是最好不要再生?好吧,这样看。。。用户请求:给我那个页面。你的网站:好的,访客aeb123。访客。好的,我是aeb123。你的网站。不,老兄,我会叫你123的。下一个请求。你好,我是aeb123。你的网站我不知道任何aeb123。我只知道123。要防止会话劫持,请使用长会话id。在会话到期之前,很难及时强制执行它们。如果用户每分钟向同一个页面发出超过100个请求,那么可以使用洪水防护来阻止用户,这是一个相当不错的防护措施。@Michaeldibtes您不需要强行劫持会话。XSS是一种攻击向量,它可以很容易地给客户端cookies。