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

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

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

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

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

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

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

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

【问题讨论】:

    标签: php security session


    【解决方案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) 不是在服务器上乱扔会话文件吗?
      猜你喜欢
      • 2015-04-03
      • 2012-07-21
      • 1970-01-01
      • 1970-01-01
      • 2018-07-31
      • 2011-07-13
      • 2011-08-19
      • 2019-08-13
      • 1970-01-01
      相关资源
      最近更新 更多