“关闭其他会话”按钮

时间:2012-12-21 20:59:15

标签: php session sessionid

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

我正在考虑在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()之后更新该表,删除过期的条目。

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

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

1 个答案:

答案 0 :(得分:2)

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

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

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

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

攻击者甚至可以将有效用户扔出系统吗?这应该被阻止。

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