2015-04-07 107 views
0

我一直在尝试在线搜索可能的答案这个问题,但我真的无法弄清楚。有很多人有类似的问题,但我有一个独特的触摸,我不明白,也没有在其他地方遇到过。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根目录之外,但是如果我将它们放回到根目录中,问题就不会解决,所以我猜测可以不是问题。
+2

删除'session_regenerate_id(真)'你不想重新生成会话ID。让PHP处理所有会话ID的东西。你应该有一个'$ _SESSION ['myid']'',它保存你想要的数据库项的关键字。 – Tschallacka

+0

谢谢,但根据我提到的教程,重新生成会话ID更安全; “此外,”session_regenerate_id()“函数可在每次重新加载页面时重新生成会话ID,有助于防止会话劫持。”这是真的,还是最好不要再生? –

+1

好吧,看看它这样...用户请求:给我那个页面。您的网站:好的访客aeb123。游客。好吧,我给你。您的网站。哈哈,我会打电话给你。下一个请求。你好网站,im aeb123。您的网站我不知道任何aeb123。我只知道dude123。为了防止会话劫持,请使用长会话ID。他们很难在会议结束前及时暴力破解。如果将一分钟超过100次的请求发送到同一页面,您就可以将这项功能与防洪功能相结合,从而节省用户的体力。 – Tschallacka

回答

0

我实际上通过编辑代码的再生片解决了这个问题。删除再生不起作用,但我通过设置我忘记改变的参数(即生命期,路径和域)并从session_regenerate_id()中删除参数“true”来修复它。命令(我直接从教程中复制粘贴了这段代码,但在进行所有更改时未注意到这些事情)。

不过,我还是很好奇的var_dump如何能够避免这个问题..