【问题标题】:Session disable inactivity logout会话禁用不活动注销
【发布时间】:2017-12-19 03:20:41
【问题描述】:

我的问题是我的用户一直对我说“保持登录”复选框对他们不起作用(cookie 已设置/他们查看了浏览器当前的 cookie 并找到了它们)。 现在我检查了两次我的代码,但我找不到任何错误。 这是我的代码:

if(isset($_POST['stay_logged_in']) == '1') { 
setcookie("anyusr",$username,time()+(3600*24*30)); //30 days
setcookie("anytoken",$securitytoken,time()+(3600*24*30)); //for checking
}

我错过了什么吗?还是我应该添加一些东西?

其他信息

  • $_POST['stay_logged_in'] 的值设置正确 (1)
  • 用户可以关闭并重新打开浏览器并保持登录状态 (2)
  • 会话可能比预期提前到期吗?我不使用任何“自动注销”功能
  • 只有在 logout.php 中的会话才会被销毁
  • 在 linux debian 服务器上使用 apache2
  • 大约发生。在现场 30 分钟后最多 1 小时“不活动”

检查会话:

if(!isset($_SESSION)) { session_start(); }

后来我用它来检查会话是否有效

if ($_SESSION['anyusr'] != $meUser['username'] XOR
$_SESSION['anytoken'] != $meUser['superspecialneverguessedtoken']){
setcookie("anyusr","",time()-31536000);
setcookie("anytoken","",time()-31536000); 
session_unset();
session_destroy(); }

我的复选框在这里:

<input type="checkbox" id="stay_logged_in" name="stay_logged_in" value="1">

感谢您的帮助。

对于所有其他人 - 这是我的工作解决方案:

if ((isset($_COOKIE['anyusr'])) && (isset($_COOKIE['anytoken']))) {
    $AnyUser = mysql_real_escape_string($_COOKIE['anyusr']);
    $AnyToken = mysql_real_escape_string($_COOKIE['anytoken']);
    $CookieUser = ''; // num_rows WHERE $AnyUser AND $AnyToken
        if ($CookieUser == 1) {
            session_start();
            $_SESSION['anyusr'] = $_COOKIE['anyusr'];
            $_SESSION['anytoken'] = $_COOKIE['anytoken'];
        } else {
            session_start();
            setcookie("anyusr","",time()-31536000);
            setcookie("anytoken","",time()-31536000);
            session_unset(); 
            session_destroy();
            // Later: Redirect to login
        }
}

【问题讨论】:

  • 您设置了 cookie,但您从不检查 cookie。您不应该“自动登录”未登录但设置了有效 cookie 的用户吗?
  • 我想如果我用随机字符串检查会话就足够了。感谢您的快速评论。
  • 但这就是问题所在,如果您希望用户在 3 天后保持登录状态,那么会话可能已经过期,但 cookie 仍然存在(除非他们已清除它,但这是用户的选择不是你的)。
  • 啊,好吧,这听起来很合乎逻辑。我现在想尝试@trpx 的解决方案 - 再次感谢 :)。

标签: php session cookies session-cookies setcookie


【解决方案1】:

我想将其写为评论,但由于代表较少,因此必须将其作为答案分享。所以,我们开始吧。在您的代码中,您正在检查会话是否有效。但在 30 分钟(或一小时)后,它会被服务器设置破坏。因此,您还必须检查是否设置了 cookie。如果存在 cookieOR 会话,您可以检查用户是否有效。这样的事情应该会有所帮助:

if (($_COOKIE['anyusr'] || $_SESSION['anyusr']) && ($_COOKIE['anytoken'] || $_SESSION['anytoken']))
{
    // check if user is valid
    // if valid, user is logged in
    // set your session variables with userdata again
}

【讨论】:

  • 实际上这似乎确实试图解决 OP 的问题,所以它应该是一个答案。
  • 感谢您的回答,@trpx - 我认为如果我检查会话变量就足够了。如果问题得到解决,我将编辑我的代码并稍后给你一个检查答案(以及“经过验证的答案”标记)。
猜你喜欢
  • 1970-01-01
  • 2016-11-03
  • 2015-09-28
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 2013-02-20
  • 2020-05-19
  • 2022-06-10
相关资源
最近更新 更多