【发布时间】:2011-12-31 06:54:15
【问题描述】:
PHP 手册似乎没有提供检查给定session_id 是否存在的方法。例如,session_id() 有一个可选的id 参数,但它替换了现有的id,而不是按照所需的方法进行查找:session_id_exists(some-id)
为什么我需要检查给定的session_id 是否存在?用例是一项体育订阅服务,其中密码共享已成为问题。登录时,我将用户的会话 ID 存储在 DB 中,并使用它与附加到给定 userID 的任何其他现有会话 ID 进行比较。
为了实现,我需要检查当前会话中是否存在收集的会话ID(密码共享的证明是多个用户同时登录)。
我认为有一种简单的方法可以实现这一点......
【问题讨论】:
-
没有内置方法可以做到这一点(AFAIK)-我认为您必须循环会话数据目录中的文件并检查相关文件名。我的直接反应是“你可以只用数据库来做到这一点”但现在我想起来了,我不知道如何......
-
我看不出获取会话 ID 在这里有什么帮助。会话 ID 在第一次访问会话时生成。两个用户将“永远不会”获得相同的会话 ID。您可以做的是在每个页面视图中检查当前用户的会话 ID 是否与数据库中存储的会话 ID 匹配,如果不匹配,则将用户注销。
-
对我来说这可能是一个安全功能;即不允许查找与当前用户会话无关的会话数据。我的意图是,在发现多个用户登录单个帐户时,将他们全部注销(取消设置他们的会话),锁定帐户并要求更改密码
-
@CodeCaster,我宁愿避免每次页面查看方法和数据库查找的开销(尽管很小)。回复:2 个用户永远不会获得相同的会话,这正是重点。如果数据库会话跟踪器包含附加到单个用户 ID 的 1 个或多个记录并且存储的 sessionID 处于活动状态,那么我们知道密码已经泄露——因为尝试登录的用户和已经登录的用户不能是同一个人(还跟踪设备和 IP)
-
@CodeCaster 我认为你有点忽略了这一点 - 他需要做的是检查两个当前存在的会话是否具有与它们关联的相同用户。因此,当用户使用会话 ID 登录时,它会被存储,但如果另一个用户使用相同的用户名但不同的会话 ID 登录,则密码已与某人共享。关键是检查两个会话 ID 是否同时存在 - 可以想象一个合法用户会有两个会话 ID,但一个会过期。这个案例是有道理的,尽管这种方法有点缺陷(例如,如果一个用户使用 2 个浏览器)