重新生成会话 ID

Posted

技术标签:

【中文标题】重新生成会话 ID【英文标题】:regenerating session id 【发布时间】:2011-12-29 09:19:23 【问题描述】:

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

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

实现此目的的另一种方法是这样做:

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

但是,我听到对该功能的批评说,如果页面由于某种原因刷新过快,会话 id 就会失效。

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

还有其他方法可以实现这一目标。最佳实践是什么?

【问题讨论】:

【参考方案1】:

最佳实践是使用 SSL(并针对 XSS 和 SQL 注入等其他安全攻击向量应用通常的防御措施)。循环会话 id 只是在乞求比赛条件。

【讨论】:

SSL 不会保护您免受通过 XSS 等获取的 cookie 的侵害。 "我熟悉 ssl,但我不想从我的虚拟主机购买它 @Dmitry — 便宜或安全,选择一个。 好吧,我正在开发一个政治论坛,我会选择便宜的选择,我为什么要关心?【参考方案2】:

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

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

如果您还需要,您可以将上次重新生成的时间存储在会话中,然后在 30 分钟后致电 session_regenerate_id,但绝对不需要在每个页面上都这样做。

【讨论】:

【参考方案3】:

与其生成会话ID,不如加密并使用已经生成的ID。它可以在预期的操作完成时使用和销毁。

【讨论】:

最好的情况是重新生成id only one.at the point of entry(login) only。 我该怎么做?如何获取会话 ID。我有一个有效的加密功能,我可以解密它。我不关心速度..这是这样做的方法吗: session_id($newSession);然后当我解密它时,如何保存旧的会话 ID ..?在数据库中? session_start();session_regenerate_id(true); $_SESSION['user_session']=session_id(); $user_session=$_SESSION['user_session'];//尝试通过$user_session进行加密,可以先echo进行测试 使用后记得取消设置会话 unset($_SESSION);如果你不再需要它,你也可以考虑销毁它。 session_destroy(); 好的,我知道了,我需要把session id存入数据库,然后我需要对session id进行加密,当我想和数据库的值比较的时候再解密。是这样的吗?【参考方案4】:

但是,我听到对该功能的批评说,如果页面由于某种原因刷新过快,会话 id 就会失效。

好吧,我想你必须尝试一下才能确认这一点,但我认为你永远不会遇到这个问题。

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

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

【讨论】:

为什么每次用户登录网页都要重新生成会话 我喜欢这样的想法,即每当我的用户输入或离开我限制给其他人的东西时,他们就会开始一个新会话。至于为什么,我没有技术论据。 这对我来说不是问题 - 我不能否认它会发生,正如许多人警告的那样,但我还没有经历过它。【参考方案5】:

确实有问题(在页面刷新或在 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); 登录、注销等(任何权限级别更改)

【讨论】:

session_regenerate_id(FALSE) 不是在服务器上乱扔会话文件吗?

以上是关于重新生成会话 ID的主要内容,如果未能解决你的问题,请参考以下文章

重新生成会话 ID

登录后重新生成会话 ID 是一种好习惯吗?

使用nodejs中的用户对象登录后将重新生成的会话ID发送回用户代理

检查用户代理并在会话类中重新生成会话 ID

PHP在登录/退出时重新生成会话ID不起作用

NodeJS redis 连接会话 ID 在应该保持不变时重新生成