【问题标题】:How to properly regenerate session ID's?如何正确重新生成会话 ID?
【发布时间】:2011-08-19 21:48:00
【问题描述】:

我已经建立了一个会话库,但我遇到了一个非常随机的错误(我真的不知道如何对此进行单元测试,所以我只是用日志消息填充了所有内容并等待它再次发生),这会转化为由于会话 ID 不匹配,用户正在注销。

应用程序的流程是这样的:

  • 发出了具有有效会话 ID 的请求
  • 在数据库中找到该会话 ID 的会话数据
  • “最后一个活动”恰好是旧的,因此它在数据库中重新生成和更新
  • 新的会话 ID 在响应中发送(作为 cookie)

这几乎总是可以正常工作,但有时下一个请求无法匹配会话 ID,因为(这是我的猜测)它是在我们更新数据库之后发送的(在上一个请求中,它仍在运行),但之前带有新 cookie 的响应进来了。

我是否误解了重新生成会话 ID 的概念?我只是出于安全原因重新生成会话 ID,因此选择登录一年的人仍然会不时更改其会话 ID。

【问题讨论】:

  • 不匹配的会话 ID 是与重新生成之前相同还是完全不同?
  • 和再生前一样

标签: php unit-testing http session cookies


【解决方案1】:

我假设您使用的是session_set_save_handler(),对吧..?如果是这样,请尝试执行以下操作:

session_regenerate_id($delete_old_session = true);
session_write_close();

甚至:

session_regenerate_id($delete_old_session = false);
session_write_close();

调用session_write_close() 应该可以有效地保存新的会话数据。您只需在调用它时(通常在权限更改 > 重定向之前)注意,因为它会结束会话。


结束当前会话并存储 会话数据。

会话数据通常存储在 您的脚本在没有 需要调用 session_write_close(), 但由于会话数据被锁定到 防止并发写入只有一个 脚本可以在任何时间对会话进行操作 时间。

【讨论】:

    【解决方案2】:

    一种选择是为每个用户保留多个会话 ID,但在它们上设置到期时间 - 当需要重新生成会话 ID 时,添加新的会话 ID,然后在旧的 ID 上设置一个等于某个合理期限的到期时间时间(也许是一分钟)。继续接受旧的和新的,直到旧的过期。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-03
      • 2011-12-29
      • 2012-08-12
      • 1970-01-01
      • 2012-07-21
      • 1970-01-01
      • 2018-07-31
      • 2011-07-13
      相关资源
      最近更新 更多