繁体   English   中英

如何使用php会话cookie保持用户登录我的网站

[英]How to keep a user logged into my website using a php session cookie

最初,我想出了以下方法来查看用户是否已经登录:

<?php 
  session_start();
  if(!isset($_SESSION['sessionid'])) {
   header("Location: login_form.php");
  } else {
   echo "You are logged in";
  }
?>

用户手动登录时设置$_SESSION['sessionid']

如果用户选中“记住我”,则将会话Cookie的生存期设置为10年:

   $lifetime = 24*60*60*365*10; // 10 years
   setcookie(session_name(),session_id(),time()+ $lifetime,'/'); 

因此,现在我需要弄清楚在服务器端该做什么。...最初,我正在考虑将session.gc_maxlifetime设置为较高的值,以便服务器的会话数据可以长期使用,但是10年将是荒谬的。 现在,我正在考虑将会话ID存储在用户表中,并针对会话ID进行查询。 如果有匹配项,我将自动登录用户。

我的问题是:如何从客户端获取会话ID?

我的理解是,在我调用session_start()之后,它将仅在服务器的会话数据仍然可用时才可用。 如果会话已过期(取决于session.gc_maxlifetime的值),则在调用session_start()时将生成一个新的会话ID。 这将是有问题的,因为它与我存储在用户表中的最后一个会话ID不匹配。

因此,在调用session_start()之后,我必须阅读会话ID的想法是:1) $_SESSION['sessionid'] 2) $id = session_id(); 3) $_COOKIE["PHPSESSID"];

如果服务器销毁了会话数据,则1和2将无法工作,因此我认为我无法使用这些数据。

3可能echo $_COOKIE["PHPSESSID"]; ,但是当我尝试它时( echo $_COOKIE["PHPSESSID"]; )我很惊讶,因为会话ID出现了两次:输出是这样的:

htknitopug4b6bv4ql9050pfg6 //htknitopug4b6bv4ql9050pfg6

我只是期望输出为htknitopug4b6bv4ql9050pfg6.

谁能解释会话ID的重复条目? 如果这种行为是一致的,我总是可以将第一个字符串读入数据库表中。

简短的答案是您不应该这样做。 由于某些原因,请参阅此答案

至于要做什么,我将设置一个签名的cookie(该帖子显示如何操作),其中包含每个用户唯一的大随机字符串。 然后,在加载会话(如果是新会话)时,请检查cookie。 然后根据该随机字符串查找用户。 如果找到一个,则以静默方式重新登录用户。

这是一个非常标准的“记住我”功能,但是它避免了长时间运行会话或将会话标识符用于其他用途的麻烦。

需要注意的一件事是,您实际上也应该经常轮换您的会话标识符。 我通常会在每次登录/注销事件以及用户执行任何敏感操作(管理表单,发布内容等)时执行此操作。 旋转太多没有错...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM