我有一种情况,我的系统检测到 cookie 是否被劫持。如果我在两个不同的浏览器之间克隆 cookie,那么我的系统可以杀死作为克隆的浏览器上的会话 cookie,从而保护原始会话。
但我有一个问题。如何在同一会话中为克隆的浏览器重新生成新的会话 ID 值?我基本上会给克隆一个新的会话 ID,它是原始会话 ID 数据的干净,而不影响原始会话 ID 数据。
这是我的克隆当前发生的情况:
- 系统检测到此会话是使用不同的指纹启动的,因此它是克隆或劫持的 cookie
- 会话数据无法访问,之前的会话数据使用 session_write_close() 写入磁盘,之后 $_SESSION 变量被完全清除。
- 通知用户代理(浏览器)删除克隆的会话 cookie
我想要发生的事情是不会删除 cookie,而是分配一个新的 - 不同的 - 会话 ID,这样不会删除当前会话,而是创建一个空的新会话。
我不能使用 session_regenerate_id(),因为它希望启动会话并且它将启动前一个会话而不是一个新会话,并且我之前的原始会话数据将丢失并且无法从前一个会话访问。我可以使用 session_id() 函数分配一个新的会话 ID,然后使用它,但是如何生成与 PHP 本身生成的一样安全的会话 ID 值?
基本上我想做的就是如果我检测到克隆会话,那么我仍然想启动会话,但是我想替换克隆会话的会话 ID,同时保持原始会话仍然存在。