跨浏览器:PHP 终止会话


Cross Browser: PHP Kill Sessions

我试图在登录用户之前杀死用户的上一个会话: 更多上下文,我想防止用户在不同的浏览器或位置使用相同的用户名/密码登录,阻止他们跨浏览器操纵会话状态(如游戏平衡)。

这是我到目前为止所做的,但没有成功1) 获取用户在成功登录时存储在数据库中的最后一个session_id,并将其保存在名为 $old_session_id 的变量中

2) 尝试使用以下代码删除最后一个会话

session_id($old_session_id);
session_start();
session_destroy();

3) 尝试使用 session_start() 为用户启动一个新的、干净的会话

我看到的是新会话没有启动 - 用户在两个浏览器上都注销了

任何帮助不胜感激!

客户端计算机上设置的 cookie 标识的 PHP 会话,并且 cookie 不会在浏览器之间共享。这不是问题。

#2 中的代码可能会将该用户的会话当前会话 ID 显式更改为先前浏览器中会话的 ID,这会导致您尝试解决的问题

此外,每个请求只能调用一次 session_start(),因此 #3 当然会失败。

简而言之,只要停止做你在问题中提到的所有事情,你的问题就会自行解决。

一旦会话被销毁,就必须创建一个新会话。

如果您只想清除会话上的值,也可以尝试以下操作:

session_start();
$_SESSION = array(); //unset all session variables
您可以使用

session_regenerate_id创建新 ID。清除会话数据,重新生成 ID 并开始新的会话数据。

http://php.net/manual/en/function.session-regenerate-id.php

会话仅存储在您的浏览器中,因此,如果您想查看用户是否已登录其他浏览器,则需要使用数据库

向数据库添加状态为 1 或 0 的行

1 = "在线";

0 = "离线";

在登录页面中检查用户状态,如果为 1

$query=mysql_query("select status from table_name were username=$_POST['username']");
$status=$query['status'];
if($status == 1)
{
redirect him to a page saying the account is already logged in
}else
{
let him in and update the database status = 1
}

在注销页面中时 将用户状态更新为 0 使他脱机

如果您只想删除所有会话使用在销毁之前先使用会话启动,然后再使用会话启动,因为您无法在不启动会话的情况下销毁会话

session_start();
session_destroy();
session_start();

但是,如果要删除特定会话,则需要使用

unset($_SESSION['sessionname']);