Php 在设置安全值之后或之前重新生成会话id

Php 在设置安全值之后或之前重新生成会话id,php,Php,这是一个非常具体的问题,关于何时准确调用会话\u regenate\u id()。在会话中设置安全值之前或之后调用session\u regenate\u id()是否存在差异或安全风险 在设置值之前: if ($login_success) { session_regenerate_id(true); $_SESSION['login_status'] = 'logged_in'; } 或在会话中设置值后: if ($login_success) { $_SES

这是一个非常具体的问题,关于何时准确调用
会话\u regenate\u id()
。在会话中设置安全值之前或之后调用
session\u regenate\u id()
是否存在差异或安全风险

在设置值之前:

if ($login_success) {

    session_regenerate_id(true);
    $_SESSION['login_status'] = 'logged_in';

}
或在会话中设置值后:

if ($login_success) {

    $_SESSION['login_status'] = 'logged_in';
    session_regenerate_id(true);

}

它们实际上是相同的;实际上,只有在调用session_write_close()时(或者在脚本结束时隐式地)会话信息才会持久化。因此,旧id的数据不会持久化。

这就是它的工作原理,
会话重新生成\u id()
将创建和更改会话id,将会话传输到新文件并发送cookie。将
true
作为参数传递也将删除旧会话文件,省略该参数将保留该文件

那么,你是否使用

session_regenerate_id(true);
$_SESSION['login_status'] = 'logged_in';


这是一样的:信息被重写到新文件,cookie被发送出去。我建议您始终使用
true
作为参数,以避免旧的会话劫持。

Hi@obe您能确认session\u regenate\u id()是否隐式调用session\u write\u close()和session\u start(),或者我是否必须将regenate、change value、close和start session组合起来以直接保存更改?@Nitin,这是PHP,您的事务将很快结束,并将标题(cookie)发送到客户端。因此,imo,无需在重新生成后关闭和重新启动会话。您的回答完全正确,我感谢您的输入,但它没有解决实际问题。为了避免其他程序员感到困惑,我更改了答案。没有双关语(我对你的答案投了赞成票)。
$_SESSION['login_status'] = 'logged_in';
session_regenerate_id(true);