以前我正在使用唯一的哈希创建额外的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进程执行)
第二个问题是,如果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();
Run Code Online (Sandbox Code Playgroud)
所以,在第一个浏览器中,我刚刚使用?test = 1参数启动了这个脚本,就在此之后(当这个脚本执行时)我在第二个浏览器中启动了没有参数的脚本.答案是否定的 - 第二个浏览器的cookie没有受到影响.它有生命周期,在php.ini中指定
更新3:[问题2答案] 然后,我试图检查再生是否影响会话cookie生存期,这是由session_set_cookie_params设置的.
是的,它会影响.如果我设置具有自定义生命周期的会话cookie,由session_set_cookie_params设置,然后调用session_regenerate_id(),cookie将具有生命周期,在php.ini中设置
但是,如果我们在调用session_regenerate_id()之前设置session_set_cookie_params(0),我们的cookie将具有正确的生命周期.
就是这样了!那很简单!8)
谢谢女士们,先生们!
由于很难实现“记住我”复选框功能,因此我采用了另一种方法,仅使用一个 cookie。
准备
1)我准备了一个包含三个输入的表单:
2)我设置了session.cookie_lifetime = 100500以默认保留长寿命cookie。
Cookie 设置
因此,在用户提交表单后,我们检查 - 如果他选择使用短会话 - 我们在为他设置会话 cookie 之前调用 session_set_cookie_params(0) (在实际使用 session_start() 之前)。
Cookie 再生
然后,当我们需要重新生成会话cookie时,我们也可以使用session_regenerate_id()函数轻松完成此操作。但我们需要记住,默认情况下,此函数将从 php.ini 重新设置会话 cookie 生存期。因此,在重新生成 cookie 之前,我们还需要调用 session_set_cookie_params()。顺便说一句,您可以将自定义会话 cookie 生命周期存储在 $_SESSION 中。它看起来像这样:
// Form handling, session setup
if ($_POST['not-my-computer']) {
session_set_cookie_params(0);
session_start();
$_SESSION['expires'] = 0;
}
// Session regeneration
if (isset($_SESSION['expires'])) {
session_set_cookie_params(0);
session_regenerate_id();
}
Run Code Online (Sandbox Code Playgroud)
您可以在问题文本中找到此答案的详细信息(以及更深入的解释)(当我测试时,我在那里添加了答案/测试结果)