【问题标题】:Ways to drop/manage user's sessions in case that sessions are stored in default php session storage?如果会话存储在默认的 php 会话存储中,如何删除/管理用户的会话?
【发布时间】:2012-11-16 19:33:36
【问题描述】:

当会话存储在默认的 php 会话存储中时,有什么方法可以删除用户会话?

例如,我是网站管理员,我想禁止登录用户。用户认证状态存储在会话中。我正在从数据库中删除用户行,但仍然记录了用户,并且所有必要的身份验证信息也存储在会话中。我需要删除/修改会话。

可能的方法:

  • 在每次请求时从数据库中加载用户行
  • 创建文件,表示删除用户会话并在每次请求时检查此文件是否存在
  • /dev/shm 中的crete 文件(检查速度非常快),但重新启动时文件将被删除
  • 在数据库中存储会话(我的项目的开销)
  • 在 nosql(redis、memcachedb)中存储会话(我的项目的开销)

除了将用户会话存储在数据库或 nosql 数据存储中之外,还有什么优雅的方法吗?

【问题讨论】:

  • 我不太确定我是否遵循,但为什么不使用 session_destroy() - 或者只是取消设置用于检查登录状态的登录变量?
  • @jtheman 他在说管理员面板禁用用户。不是用户做的事情会禁用他的帐户并破坏他的会话。
  • 默认 php 会话存储是基于文件的。要在外部杀死一个会话,你需要知道会话的ID,然后删除对应的会话文件(通常sess_XXX,其中xxx是会话ID)。可能“禁止用户”脚本中的 5 行代码(最多)可以完成此操作,即使只是 unlink(session_save_path() . "/sess_$bannedID") 也可以。
  • 据我了解,会话只能由创建它们的用户访问。因此,您必须在每个请求上加载用户的行(或该信息的一小部分)。但我不是专家,对不起。 php.net/manual/en/session.security.php
  • @Ray 好的,现在我明白了。是的,将会话 ID 保存在数据库中,然后禁止用户,而不仅仅是删除数据库中的用户会话。还有会话文件...

标签: php


【解决方案1】:

我知道如何做到这一点的唯一方法是删除会话记录。如果是文件,请删除会话文件。如果会话存储在数据库或内存缓存中,请将其删除。棘手的问题是如何找到会话 id 以及是否存在某个用户。

如果它是一个文件,并且您在其中存储了电子邮件或用户 ID,则可以查找该文件。数据库中的会话存储应该易于查询。不知道你会如何在 memcache 中做到这一点。

如果您不在每个请求上重新生成会话,则始终可以将会话创建时的 session_id 设置为用户独有的东西——如果您不使用 SSL,请注意您可能会打开一种劫持会话的方法,如果您使用的唯一键很容易猜到(如 user_id)。然后,您可以在用户登录时将用户会话 ID 与用户记录一起存储在数据库中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-22
    • 1970-01-01
    • 2017-12-02
    • 1970-01-01
    • 1970-01-01
    • 2011-08-09
    • 2015-05-18
    相关资源
    最近更新 更多