繁体   English   中英

强制用户注销会话PHP

[英]Force user to logout session PHP

我似乎无法找到这个问题的直截了当的答案。 有没有办法可以强制登录用户注销? 我的登录系统基本上只依赖于包含用户唯一ID(存储在mysql数据库中)的会话。 所以基本上只是......

if (isset($_SESSION['user_id'])) {
echo "You're logged in!";
} else {
echo "You need to login!";
}

但是,假设我想要禁止这个用户,我可以在我的数据库中将其状态更改为禁止,但在用户注销并尝试重新登录之前,这将不会执行任何操作...所以,我该如何强制此用户退出? 最好不要每次检查他们查看页面是否他们的状态已被切换为“禁止”,因为这似乎是我服务器上的不必要的压力。 感谢任何帮助,谢谢。

您需要在每次加载页面时进行检查,或者可能按设定的时间间隔查看Ajax调用以从数据库检查其状态。

然后你可以使用session_destroy(); 结束他们的会议。 这会破坏整个会话。

否则你可以使用unset($_SESSION['user_id']); 取消设置单个会话变量

最好不要每次检查他们查看页面是否他们的状态已被切换为“禁止”,因为这似乎是我服务器上的不必要的压力。

在每次加载页面时从数据库加载用户,而不是在会话中存储用户的副本,这是一个非常合理的解决方案。 它还可以防止用户与数据库中的副本不同步(例如,您可以更改用户的属性或权限,而无需他们注销并重新登录)。

试着把它放在每一页......

if (isset($_SESSION['user_id'])) {

    $sql = "SELECT from tbl where status='banned' and user_id=$_SESSION['user_id'] ";
    $query = mysql_query($sql);

    if(!empty(mysql_num_rows($query))){ // found the banned user
       //redirect to logout or
       //session_destroy();
    }

} else {
echo "You need to login!";
}

如果用户仍然登录...检查他/她的状态是否被禁止......如果被禁止..然后注销

你可以取消它。

unset($_SESSION['user_id'])

您可以使用自定义会话处理程序,这样您就可以完全控制会话数据在服务器上的存储位置和方式。

因此,您可以将特定用户的会话数据存储在名为<user_id>.session的文件中。 然后,要注销用户,只需删除该文件。

间隔中的Ajax调用将在服务器上增加额外负载。 如果您想要对您的操作进行实时响应(例如,当您从系统后端禁止用户时,用户将被正确注销),那么您应该查看Server Push

这个想法是在用户浏览您的网站时保持从服务器到浏览器的隧道打开,以便您也可以从服务器端与它们进行通信。 如果您希望禁止它们,请按下注销请求和页面中的进程(即通过取消设置强制注销)。

这适用于我使用pHP 5.4包括'connect.php';

  session_start();
  if(session_destroy())
  {
     header("Location: login.php");
  }

您可以使用session_save_path()来查找PHP保存会话文件的路径,然后使用unlink()删除它们。

删除存储在服务器中的会话文件后,客户端PHPSESSID cookie将不再对身份验证有效,并且用户将自动退出应用程序。

使用这种方法时请小心,如果有问题的路径是全局/ tmp目录! 除了PHP之外,还有其他进程存储临时数据。 如果PHP为会话数据留出了自己的目录,那么它应该是相当安全的。

基于安全性,我认为有几种方法可以做到最好:注意:这真的很粗糙....我知道语法错误,它只是为了让你有个主意。

$con = mysql_connect("localhost","sampleuser","samplepass");
if (!$con)
{
$error = "Could not connect to server";
}
mysql_select_db("sampledb", $con);
$result = mysql_query("SELECT * FROM `sampletable` WHERE `username`='".$_SESSION['user_id']."'");
$userdeets = mysql_fetch_array($result);
if($_SESSION['sessionvalue'] != $userdeets['sessionvalue'])
{
session_destroy();
Header('Location: logout.php');
}
else
{
$result2 = mysql_query("UPDATE `sessionvalue` WHERE `username`='".$_SESSION['user_id']."' SET `sessionvalue` = RANDOMVALUE''");
 $sesval = mysql_fetch_array($result2);
$_SESSION['sessionvalue'] = $seshval
}

现在我知道这不是代码,但实质上你需要做的是保证安全并具备这种能力:

  • 每次页面加载检查时,会话值都与DB中的值匹配。
  • 每次页面加载时,都会根据随机生成的DB值设置新的会话值。 您还需要在会话中存储用户名。
  • 如果会话ID不匹配,则会销毁会话并重定向它们。
  • 如果它匹配,则创建新的会话ID。

如果要禁止用户,可以将DB中的会话值设置为“BANNED”之类的值。 此值不允许他们登录。 通过这种方式,您可以通过简单的Web表单控制用户,您也可以非常容易地生成禁止用户列表等等。我希望我有更多时间来解释它,我希望这会有所帮助。

暂无
暂无

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

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