以前我正在创建具有唯一哈希的附加 cookie “rememberme”,该哈希存储在数据库中,映射到用户 ID。
如果用户有这样的 cookie - 网站试图在数据库中找到它的值,如果找到它,会话正在建立。
后来,开发新项目我认为自己生成这个唯一的哈希可能不是很安全,并且为一个操作(用户识别)保留两个cookie(本机“PHPSESSID”+我的“rememberme”)是矫枉过正的。
也许有一种方法可以设置不是全局会话生命周期,而是为不同的用户会话单独设置它......或者最好将用户会话保留在数据库中,映射到用户 ID?
更新 1 我认为如果制作“记住我”按钮如此困难,我们可以采用另一种方式 - 制作“不是我的电脑按钮”。想法是在 php.ini 中设置一周的默认 cookie_lifetime(例如),如果用户选中此复选框 - 我们将使用 session_set_cookie_params 函数将 cookie_lifetime 设置为零。
所以,第一个问题是 - session_set_cookie_params 会影响其他用户的 cookie(在文档中说, session_set_cookie_params 选项将在 php 进程执行之前生效)
2d 问题是,如果 session_set_cookie_params 不影响全局设置,会话再生会影响不想保留长寿命 cookie 的用户吗?
更新2:[问题1答案]
刚刚测试了 session_set_cookie_params 函数。我编写了一个脚本,使用 session_set_cookie_params 将会话 cookie 生命周期设置为零,然后执行 30 秒:
if ($_GET['test']) {
session_set_cookie_params (0);
while (true) {
sleep(1);
}
}
session_start();
因此,在第一个浏览器中,我刚刚使用 ?test=1 参数启动了这个脚本,之后(当这个脚本正在执行时)我在第二个浏览器中启动了这个没有参数的脚本。答案是否定的——第二个浏览器的 cookie 没有受到影响。它有生命周期,在 php.ini 中指定
更新 3:[问题 2 答案] 然后,我尝试检查重新生成是否会影响 session_set_cookie_params 设置的会话 cookie 生命周期。
是的,有影响。如果我用自定义的生命周期设置会话 cookie,由 session_set_cookie_params 设置,然后调用 session_regenerate_id(),cookie 将具有生命周期,在 php.ini 中设置
但是,如果我们在调用 session_regenerate_id() 之前设置 session_set_cookie_params (0),我们的 cookie 将有正确的生命周期。
就是这样了!那很简单!8)
谢谢你们,女士们,先生们!