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

sta*_*ack 2 php security session

我有一个这样的会话$_SESSION['login'],当它等于 时1,这意味着使用已登录到我的网站:

if ( $_SESSION['login'] == 1 ) {
    // You are logged
} else {
    // login/register
}
Run Code Online (Sandbox Code Playgroud)

我还有另一个包含用户 ID 的会话。像这样的东西:

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

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


编辑:我正在尝试做的所有事情:当用户更改他的密码时,我从cookies表中删除他的所有 cookie,以将他从所有其他设备上注销。我也想删除他的会话。

Bee*_*ice 5

更新答案

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

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

您的问题本质上是如果您使用会话,如何跨设备实现单点登录/注销。

这是一个简单的方法:

  1. 用户登录,您设置userIDlastSeen进入会话。lastSeen持有时间戳。在会话中不保存用户可以更改的信息。
  2. 用户登录到另一台设备,您设置userIDlastSeen在该会话中
  3. 跨设备的会话始终保持同步(除了lastSeen),因为它们只保存不变的数据(用户 ID、用户名)
  4. 在您的数据库中,有一个logout带列的表userID requestTime
  5. 如果用户注销、更改她的密码或执行任何其他需要重新登录的操作,请调用session_destroy()并在logout表中添加一个条目
  6. 当用户尝试访问受限页面时,您检查:
    • 是否$_SESSION['userID']存在(意味着用户在某个时间登录)
    • lastSeen在最后30分钟内(否则,打电话session_destroy(),并要求重新登录)
    • 是否有与用户的ID中的一个注销请求,logout并与requestTime > lastSeen(手段,因为我们最后一次看到用户,她要求将其从其他设备注销)。如果是这样,则session_destroy()需要再次登录。

原答案

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

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

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

如果在一个用户的浏览会话中,您想与另一个用户混为一谈:我没有看到用例。听起来它会对安全产生负面影响,这让我质疑你的更大架构。它违背了会话的全部目的:在服务器上为每个用户提供一个隔离的、持久的存储柜。

无论如何,要从另一个用户的浏览活动中更改随机用户的会话数据(再说一遍,为什么?),请改用数据库来保存和检索值。一个表可以很简单:

userID | sessionData | sessionExpires
Run Code Online (Sandbox Code Playgroud)

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