使用本机会话时,在php下"记住我"的最佳方法是什么?

ava*_*sin 9 php session

以前我正在使用唯一的哈希创建额外的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)

谢谢女士们,先生们!

ava*_*sin 2

由于很难实现“记住我”复选框功能,因此我采用了另一种方法,仅使用一个 cookie。

准备

1)我准备了一个包含三个输入的表单:

  • “login”输入[type=text]:用户的登录信息
  • “password”输入[type=password]:用户的密码
  • “不是我的电脑”输入 [type=checkbox]:这将告诉我们使用生命周期 = 0 的会话 cookie(关闭浏览器时必须删除 cookie)

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)

您可以在问题文本中找到此答案的详细信息(以及更深入的解释)(当我测试时,我在那里添加了答案/测试结果)