重新生成会话ID而不会使前一个失效?

时间:2012-08-24 06:30:18

标签: php security validation session cookies

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

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

这是我克隆目前发生的事情:

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

我想要发生的事情是,cookie不会被删除,而是分配了一个新的 - 不同的 - 会话ID,这样就不会删除当前会话,而是会创建一个空的。

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

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

1 个答案:

答案 0 :(得分:0)

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