如何正确重新生成会话ID?

时间:2011-05-06 05:18:11

标签: php unit-testing http session cookies

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

应用程序的流程如下:

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

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

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

2 个答案:

答案 0 :(得分:0)

一种选择是为每个用户保留多个会话ID,但是在它们上面放置到期时间 - 当重新生成会话ID时,添加新的会话ID,并将旧的到期时间等于某个合理的时间段时间(也许是一分钟)。除了新旧版本之外,继续接受旧版本,直到旧版本到期为止。

答案 1 :(得分:0)

我假设你正在使用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(),   但是会话数据被锁定   防止并发写入只有一个   脚本可以在任何会话上运行   时间。