我已经构建了一个会话库,我有一个非常随机的bug(我真的不知道如何对它进行单元测试,所以我只是用日志消息填充所有内容并等到它再次发生)转换为由于会话ID不匹配,用户被注销。
应用程序的流程如下:
这几乎总能正常工作,但有时下一个请求无法匹配会话ID,因为(这是我的猜测)它是在我们更新数据库之后发送的(在之前的请求中,仍在运行),但之前新cookie的响应进来了。
我是否误解了重新生成会话ID的概念?我只是出于安全原因重新生成会话ID,所以选择登录一年的人仍然会不时更改会话ID。
答案 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(), 但是会话数据被锁定 防止并发写入只有一个 脚本可以在任何会话上运行 时间。