2

我想在我的 PHP Web 应用程序中添加一个“关闭其他活动会话”按钮。

我正在考虑在 MySQL 表上跟踪 (userid,sessionid,expiration) 并通过以下方式终止会话:

$currentsessionid=session_id();
foreach($othersessions as $session){
    sessionid($session['sessionid']);
    session_start();
    session_destroy();
}
mysql_query("DELETE FROM sessions WHERE userid = $currentuserid AND sessionid <> $currentsessionid");
session_id($currentsessionid);
session_start();

如果用户已登录,则该表还将在每个 session_start() 之后更新,删除过期条目。

每次用户登录时都会删除过期的条目。

这是正确的方法吗?有什么建议么?

4

1 回答 1

2

在 PHP 中,会话通常是隔离的。您需要创建自己的会话处理程序并将会话(以及一些额外的跟踪信息)写入数据库,以便更易于管理。

例如,就像您在问题中所说的那样,userid. 然后,您可以搜索特定用户的会话。

您应该拥有的另一个字段是时间戳,以便您可以让会话过期,例如,如果超过 X 小时,则将它们丢弃。

如果您愿意,您还可以查看用户是否有现有会话并导入旧会话。但是,这可能会产生安全隐患。您需要考虑当攻击者而不是真实用户登录时会发生什么。

那么攻击者甚至可以将有效用户赶出系统吗?应该防止这种情况。

还要考虑到您可以在新的会话 ID 下接管前一个会话的会话数据。这与 类似session_regenerate_id(),登录应始终重新生成会话 ID,以及注销和其他重要步骤(例如,在更改电子邮件地址之前重新进行身份验证)。

于 2012-12-21T22:01:48.713 回答