Php 如何正确地重新生成会话ID';s

Php 如何正确地重新生成会话ID';s,php,unit-testing,http,session,cookies,Php,Unit Testing,Http,Session,Cookies,我已经建立了一个会话库,并且我有一个非常随机的bug(我真的不知道如何对此进行单元测试,所以我只是用日志消息填充所有内容并等待它再次发生),由于会话ID不匹配,这会转化为用户被注销 应用程序的流程如下所示: 发出具有有效会话ID的请求 在数据库中找到该会话ID的会话数据 “最后一个活动”恰好是旧的,因此它会在数据库中重新生成和更新 新会话ID在响应中发送(作为cookie) 这几乎总是可以正常工作,但有时下一个请求与会话ID不匹配,因为(我猜是这样)它是在我们更新数据库之后(在上一个请求中,

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

应用程序的流程如下所示:

  • 发出具有有效会话ID的请求
  • 在数据库中找到该会话ID的会话数据
  • “最后一个活动”恰好是旧的,因此它会在数据库中重新生成和更新
  • 新会话ID在响应中发送(作为cookie)
这几乎总是可以正常工作,但有时下一个请求与会话ID不匹配,因为(我猜是这样)它是在我们更新数据库之后(在上一个请求中,它仍在运行)发送的,但在新cookie的响应到来之前


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

一个选项是为每个用户保留多个会话ID,但要为其设置过期时间-当重新生成会话ID时,添加新的会话ID,并在旧版本上加上一个有效期,相当于一段合理的时间(也许一分钟)。除了新的会话id,还要继续接受旧的会话id,直到旧的会话id过期。

一个选项是为每个用户保留多个会话id,但要为其设置过期时间-当需要重新生成会话id时,添加新的会话id,并为旧会话id设置一个相当于合理时间段(可能是一分钟)的过期时间。除了新的,还要继续接受旧的,直到旧的过期。

我假设您使用的是
会话\u设置\u保存\u处理程序()
,对吗。。?如果是,请尝试执行以下操作:

session_regenerate_id($delete_old_session = true);
session_write_close();
甚至:

session_regenerate_id($delete_old_session = false);
session_write_close();
调用应该有效地保存新的会话数据。您只需在调用此命令时注意(通常在特权更改>重定向之前),因为它会结束会话


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

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


我假设您使用的是
会话\u设置\u保存\u处理程序()
,对吗。。?如果是,请尝试执行以下操作:

session_regenerate_id($delete_old_session = true);
session_write_close();
甚至:

session_regenerate_id($delete_old_session = false);
session_write_close();
调用应该有效地保存新的会话数据。您只需在调用此命令时注意(通常在特权更改>重定向之前),因为它会结束会话


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

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


不匹配的会话ID是否与重新生成之前相同或完全不同?与重新生成之前相同?不匹配的会话ID是否与重新生成之前相同或完全不同?与重新生成之前相同