php - 如何取消设置特定用户的 session ?

标签 php security session

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

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

我还有另一个包含用户 ID 的 session 。像这样:

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

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


编辑:我想做的就是:当用户更改他的密码时,我从 cookies 表中删除他所有的 cookie,以将他从所有其他用户中注销设备。我也想删除他的 session 。

最佳答案

更新的答案

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

When an user changes his password, I need to logout his account from all other his devices.

您的问题本质上是如何在使用 session 的情况下跨设备实现单点登录/注销。

这里有一个简单的方法:

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

原始答案

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

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

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

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

无论如何,要从另一个用户的浏览事件中更改随机用户的 session 数据(同样,为什么?),请改用数据库来保存和检索值。表格可以像这样简单:

userID | sessionData | sessionExpires

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

关于php - 如何取消设置特定用户的 session ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38603431/

相关文章:

php - 从使用 ISODate 保存的 mongodb 数据库获取时间戳

java - 错误代码 : Why is this dangerous?

python - Django Q 对象(复杂查询)安全吗?

session - GRAILS:如何通过Spring Security核心插件获取当前登录用户的数量?

php - 我如何在 php 中将 STARTTLS 与 swiftmailer 一起使用?

php - 未定义索引错误的异常处理?

javascript - 如何做 t_form html5 提交

javascript - javascript Submit() 是否停止了 php 验证的必要性?

session - golang martini session.Set 不设置任何值

php - 跟踪用户登录的时长