0

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

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

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

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

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

我看到的是新会话没有开始 - 用户在两个浏览器上都已注销

任何帮助表示赞赏!

4

4 回答 4

1

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

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

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

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

于 2013-10-16T20:03:37.307 回答
0

您可以使用 session_regenerate_id 创建一个新的 id。清除会话数据,重新生成 id 并开始一个新的。

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

于 2013-10-16T20:11:02.443 回答
0

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

向数据库中添加状态为 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']);
于 2013-10-16T20:06:41.653 回答
0

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

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

session_start();
$_SESSION = array(); //unset all session variables
于 2013-10-16T20:04:53.503 回答