如何取消设置特定用户的会话?

时间:2016-07-27 03:54:18

标签: php security session

我有一个类似$_SESSION['login']的会话,当它与1相等时,就意味着使用会记录到我的网站中:

if ( $_SESSION['login'] == 1 ) {
    // You are logged
} else {
    // login/register
}

此外,我还有另一个包含用户ID的会话。像这样:

echo $_SESSION["Id"]; 
/* It is containing the user's id (an integer number).
   Something like: 234124
*/

现在我想为具有特定ID的用户取消设置$_SESSION['login']。例如,我想unset($_SESSION['login'])$_SESSION["Id"] = 234124。我怎么能这样做?

编辑:我尝试做的一切:当用户更改密码时,我会从cookies表中删除所有Cookie,以便从其他所有设备中签出。我也想删除他的会话。

4 个答案:

答案 0 :(得分:4)

更新答案

您在评论中提供了有用的详细信息:

  

当用户更改密码时,我需要从中注销他的帐户   所有其他设备。

如果您正在使用会话,那么您的问题基本上是如何跨设备实施单一登录/注销。

这是一个简单的方法:

  1. 用户登录后,您在会话中设置了userIDlastSeenlastSeen包含时间戳。在会话中不保存用户可以更改的信息。
  2. 用户登录到其他设备,您在该会话中设置了userIDlastSeen
  3. 跨设备的会话始终保持同步(lastSeen除外),因为它们只保存不变的数据(userID,userName)
  4. 在您的数据库中,有一个logout表,其中包含userID requestTime
  5. 如果用户退出,更改了密码或执行了任何其他需要重新登录的密码,请拨打session_destroy()并在logout
  6. 中添加条目
  7. 当用户尝试访问受限制的页面时,请检查:
    • $_SESSION['userID']是否存在(表示用户在某个时间点登录)
    • 在过去30分钟内lastSeen(否则,请致电session_destroy()并请求其他登录)
    • 是否有logoutrequestTime > lastSeen中用户ID的退出请求(意味着自从我们上次看到用户后,她要求从其他设备注销)。如果是,请session_destroy()并要求其他登录。
  8. 原始答案

    会话是孤立处理的。当请求到达时,该用户的$_SESSION数据将加载到内存中。因此,如果userID 5发出请求,则您无权访问用户7的会话数据(没有一些黑客攻击)。

    如果您要取消设置当前用户的会话,无论该用户是谁,您都可以执行以下操作之一:

    session_destroy(); //clears everything for the current user
    unset($_SESSION['login']);// clears just this variable for the current user
    

    如果来自一个用户的浏览会话,您想要与另一个用户混淆:我没有看到用例。听起来它会带来负面的安全隐患,这让我质疑你的更大架构。它破坏了会话的整个目的:为每个用户提供服务器上隔离的持久存储锁。

    无论如何,要从其他用户的浏览活动中更改随机用户的会话数据(同样,为什么?),请使用数据库来保存和检索值。表格可以简单如下:

    userID | sessionData | sessionExpires
    

    您可以使用json_encode将会话数据存储在JSON中,并使用json_decode从任何浏览会话中为任何特定用户检索它。

答案 1 :(得分:2)

它将删除所有会话变量并销毁您创建的所有会话。

<?php
//start session
session_start();
// remove all session variables
session_unset(); 
// destroy the session 
session_destroy(); 
?>

答案 2 :(得分:2)

if ( $_SESSION['login'] == 1 ) {
 if ( $_SESSION["Id"] == 234124 ) {
       session_destroy();   
       session_unset(); 
 }
} else {
  // login/register
}

答案 3 :(得分:1)

使用session_destroy();

它会破坏与当前会话相关的所有数据。因此,只有预期用户(点击退出或在您的情况下更改密码的人)会话数据才会被删除。

Check this了解更多信息。