重新生成会话ID而不使上一个会话ID无效


Regenerate session ID without invalidating the previous one?

我的系统会检测到cookie是否被劫持。如果我在两个不同的浏览器之间克隆cookie,那么我的系统可以杀死作为克隆的浏览器上的会话cookie,从而保护原始会话。

但我有个问题。如何在同一会话中为克隆的浏览器重新生成新的会话ID值?我基本上会给克隆一个新的会话ID,它与原始会话ID数据无关,而不会影响原始会话ID的数据。

这就是目前在我的克隆上发生的情况:

  • 系统检测到此会话是用不同的指纹启动的,因此它是一个克隆或被劫持的cookie
  • 会话数据不可访问,使用Session_write_close()将以前的会话数据写入磁盘,然后完全清除$_Session变量
  • 通知用户代理(浏览器)删除克隆的会话cookie

不过,我想做的是,cookie不会被删除,而是分配一个新的、不同的会话ID,这样就不会删除当前会话,而是创建一个空的新会话。

我不能使用session_regenerate_id(),因为它希望启动会话,并且它会启动上一个会话而不是新会话,并且我以前的原始会话数据会丢失,无法从上一个访问。我可以用session_ID()函数分配一个新的会话ID,然后使用它,但我如何生成与PHP本身生成的会话ID值一样安全的会话ID?

基本上,我想做的就是,如果我检测到克隆的会话,那么我仍然想启动会话,但我想替换克隆会话的会话ID,同时保持原始会话仍然有效。

好吧,显然,使用session_regenerate_id()方法是可行的,该方法接受一个变量,该变量基本上说明它是否应该保留以前的会话数据。使用这个,我能够编写一个变通方法。