session_regenerate_id()与session_id(randomString)

Ale*_*hin 4 php session

session_id($randomString)和之间的明显区别是session_regenerate_id()什么?两者似乎都更改了会话ID:

session_regenerate_id()将用一个新的ID替换当前的会话ID,并保留当前的会话信息。

session_id()用于获取或设置当前会话的会话ID。

如果我做对了,session_regenerate_id()创建一个新的会话文件并复制数据,并带有删除旧文件的选项。同时session_id($randomString)只需更改现有文件中的会话ID。

如果是这样,复制文件有什么好处?从防止会话固定的角度来看,如何更好?

这个答案,或者我找到的任何其他答案,都无法回答我的问题。

Jon*_*uhn 5

好了,我做了一些测试,发现在三个不同的选项的差异(session_id($id)之后session_start()session_regenerate_id()session_regenerate_id(true))。这是实际发生的结果:


session_start之后的session_id($ id)

在session_start之后调用会话ID函数将更改会话ID。在页面加载结束时,当前会话内容将写入一个新的会话文件。这也将保留旧的会话文件,并且不会进行任何更改进行更新。但是,session_id不发送新的会话cookiesession_start即使session_id之前被调用,也可以这样做session_start。在下一次页面加载时,将传递旧会话ID并使用与上一次页面加载开始时相同的数据加载(新会话更改将已保存到新ID中)。


session_regenerate_id()和session_regenerate_id(true)

session_regenerate_id()将创建并更改会话ID,将会话转移到新文件并发送Cookie。传递true为参数还将删除旧的会话文件,省略该参数将保留它。


至于会话固定,都session_id($id)session_regenerate_id()实际情况就更糟,你正在创造新的会话,同时保留旧的会话文件周围被劫持。可能有助于解决问题的唯一方法是调用session_regenerate_id(true)传递参数。