重新生成会话 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的主要内容,如果未能解决你的问题,请参考以下文章