重新生成会话ID

时间:2011-11-15 10:01:20

标签: php security session

我正在考虑在每个页面上使用此代码以减少会话劫持的可能性。通过在每个请求上更新session_id

if(!empty($_session)){ 
   session_start(); 
}

实现目标的另一种方法是:

if(!empty($_session)){ 
  session_regenerate_id(true);
}

但是,我听到有人批评该功能,如果由于某种原因页面刷新太快,会话ID就会失效。

使用会话ID的另一种方法是更多地控制会话的生成方式。

还有其他方法可以做到这一点。最佳做法是什么?

5 个答案:

答案 0 :(得分:27)

在每个页面上调用session_regenerate_id是一个不必要的开销。

您应该只在登录时或任何重新授权用户时调用它。

如果你想要另外一个,你可以在会话中存储最后一个重新生成的时间,然后在30分钟之后调用session_regenerate_id,但是绝对不需要在每个页面上完成这个。

答案 1 :(得分:6)

确实存在问题(在页面刷新或在ajax请求中),在每个请求上使用session_regenerate_id(true);

但不是session_regenerate_id();

所以,根据

  

更改任何权限级别后续订会话ID   https://www.owasp.org/index.php/Session_Management_Cheat_Sheet#Renew_the_Session_ID_After_Any_Privilege_Level_Change

     

在每个请求上重新生成SID   http://en.wikipedia.org/wiki/Session_fixation#Regenerate_SID_on_each_request

我用

    每个请求
  • session_regenerate_id();
  • session_regenerate_id(true);登录,注销等(任何权限级别更改)

答案 2 :(得分:2)

最佳做法是使用SSL(并对其他安全攻击向量(如XSS和SQL注入)应用通常的防御措施)。骑自行车会议ID只是在争夺竞争条件。

答案 3 :(得分:1)

为什么不加密和使用已经生成的会话ID,而不是生成会话ID。当预期的操作完成时,它可以被使用和销毁。

答案 4 :(得分:0)

  

但是,我听到有人批评该功能,如果由于某种原因页面刷新太快,会话ID就会失效。

嗯,我猜你必须尝试一下才能确认,但我认为你不会遇到这个问题。

无论如何,为每个页面加载重新生成会话并不能完全保护您免受会话劫持,并且使用最好在其他地方使用的资源。一个更好的起点是查看SSL。在客户端和Web服务器之间加密数据更安全。

我个人只在用户登录时会重新生成会话ID,并且当用户退出我的应用程序时。