会话禁用不活动注销
Session disable inactivity logout
我的问题是我的用户一直对我说复选框 "stay logged in" 对他们不起作用(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)
- 会话是否比预期提前到期?我不使用任何 "auto-logout" 函数
- 只有 logout.php 个会话才会被销毁
- 在 linux debian 服务器上使用 apache2
- 大约发生。 30 分钟到 1 小时后 "inactivity" 在现场
检查会话:
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
}
}
我想把它写成评论,但由于代表较少,所以不得不将其作为答案分享。所以,我们开始吧。在您的代码中,您正在检查会话是否有效。但在 30 分钟(或一小时)后,它会被服务器设置破坏。所以你必须检查是否也设置了 cookie。如果有 cookie OR 会话,您可以检查用户是否有效。这样的事情应该有所帮助:
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
}
我的问题是我的用户一直对我说复选框 "stay logged in" 对他们不起作用(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)
- 会话是否比预期提前到期?我不使用任何 "auto-logout" 函数
- 只有 logout.php 个会话才会被销毁
- 在 linux debian 服务器上使用 apache2
- 大约发生。 30 分钟到 1 小时后 "inactivity" 在现场
检查会话:
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
}
}
我想把它写成评论,但由于代表较少,所以不得不将其作为答案分享。所以,我们开始吧。在您的代码中,您正在检查会话是否有效。但在 30 分钟(或一小时)后,它会被服务器设置破坏。所以你必须检查是否也设置了 cookie。如果有 cookie OR 会话,您可以检查用户是否有效。这样的事情应该有所帮助:
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
}