强制用户注销会话PHP

时间:2012-05-02 04:05:05

标签: php session login logout

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

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

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

9 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:5)

  

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

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

答案 2 :(得分:1)

尝试将其放在每一页上......

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!";
}

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

答案 3 :(得分:0)

你可以取消它。

unset($_SESSION['user_id'])

答案 4 :(得分:0)

您可以使用Custom Session Handlers这样您可以完全控制会话数据在服务器上的存储位置和方式。

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

答案 5 :(得分:0)

间隔中的Ajax调用会给服务器带来额外的负担。如果您希望对您的操作进行实时响应(例如,当您从系统后端禁止用户时,用户将被正确注销),那么您应该查看Server Push之类的内容。

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

答案 6 :(得分:0)

这对我有用,我正在使用pHP 5.4     包括'connect.php';

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

答案 7 :(得分:0)

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

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

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

答案 8 :(得分:-1)

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

$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值设置新的会话值。您还需要在会话中存储用户名。
  • 如果会话ID不匹配,则会销毁会话并重定向。
  • 如果匹配,则创建新的会话ID。

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