为了账号安全,请及时绑定邮箱和手机立即绑定

从其他用户销毁会话

从其他用户销毁会话

PHP
当年话下 2021-11-05 15:12:31
在我更改了其他用户的权限或禁止状态后,我尝试从其他用户那里销毁会话...我将每个用户的会话密钥写入数据库,并在访问 Profiles 时捕获它们。如果有任何更改,我希望用户立即被踢出系统......这是我的代码:    FUNCTION back_to_home() {            mysqli_close($db);            $session_id_to_destroy = $_SESSION['visit_user-session_id'];            session_id($session_id_to_destroy);            session_start();            session_destroy();            unset($_SESSION['visit_user-username']);            unset($_SESSION['visit_user-e_mail']);            unset($_SESSION['visit_user-register_date']);            unset($_SESSION['visit_user-last_login_date']);            unset($_SESSION['visit_user-register_ip']);            unset($_SESSION['visit_user-last_login_ip']);            unset($_SESSION['visit_user-steam_id']);            unset($_SESSION['visit_user-permissions']);            header('Location: ../../../');            exit;        }我希望我可以用 PHP 修复或做到这一点。我不知道 JavaScript xD所以我想知道的是,我可以那样做还是有另一种方法可以从他的会话中踢出另一个用户?
查看完整描述

1 回答

?
慕桂英4014372

TA贡献1871条经验 获得超13个赞

我尝试从其他用户销毁会话


从技术上讲,您可以做到这一点,是的,但是这个过程冗长且有问题。


如何删除任意会话。

A:查找会话


您需要使用该session_id值。该值是文件名的一部分(或者在数据库会话的情况下是会话标识符列值)。


您需要知道文件名前体(通常sess_但可以是 PHP 源代码中设置的任何内容)。您还需要知道 PHP.ini 文件中设置的会话存储位置。


例子:


带有 id 的会话58ce93c623376b3ddfca3cfc3a01d57d3be85084363147464是一个位于以下位置的文件:


/home/session_storage_folder/sess_58ce93c623376b3ddfca3fc3a01d57d3be85084363147464


但是会话文件名是即时生成的,不会(也不应该)连接到您的会员数据库中的 who 。


如果您手动生成会话 id,那么这会变得更容易,但是会话的安全性会大大降低,如果没有非常仔细的考虑,这应该真的,真的不能这样做。


B:寻找用户


现在您需要找到要禁止的用户。会话文件将包含用户 ID,不知何故,


会话数据通常存储为:


(例子)


$_SESSION['alpha'] = "UiOvMfV9byatH4Wt1SPYUO3zgsj5";

$_SESSION['beta']  =  1324; 

alpha|s:28:"UiOvMfV9byatH4Wt1SPYUO3zgsj5";beta|i:1324;


这是


[变量名称]|[变量类型]:[变量内容长度]:[内容数据]; [等等....]


因此,如果您user id设置了如下值$_SESSION['user_id'] = 45;:


用户 ID|i:45;


在会议中。因此,您需要在每个会话中搜索此数据字符串。


请阅读有关如何执行此操作的问题


所以你会有这样的代码:


$string = 'user_id|i:".(int)$user_id_to_block;

$session_file_name = null;

foreach (glob('/home/session_folder/*') as $file) {

    $content = file_get_contents("/home/session_folder/".$file);

    if (strpos($content, $string) !== false) {

        $session_file_name = "/home/session_folder/".$file;

    }

}

找到后,您可以在服务器上删除该会话。


if(file_exist($session_file_name)){

    unlink($session_file_name);

}

但:

对于许多会话,这将非常缓慢且效率低下。


你应该怎么做

您应该检查登录用户的每个页面加载是否经过身份验证。假设您的用户详细信息是数据库驱动的,您应该检查每个页面加载的详细信息是否真实。


<?php

session_start();

if($_SESSON['user_id'] > 0){

     /////

     $sql = "SELECT banned FROM users WHERE user_id = :user_id"; 

     /////

     // Etc. etc. 

     $result = get MySQL result;

     if($result['banned'] === 'Y'){

          /***

           * Member is banned. kick them out.

           ***/

           $_SESSION = []; // reset session. 

           header("Location: index.php");

           die(); 

     }

}

更新

如果您使用会话 ID 作为标识符并且您知道会话 ID 而无需搜索它;只需这样做:


FUNCTION back_to_home() {

        mysqli_close($db);


        // save current admin session (optional).

        $admin_session = session_id();

        // get target id.

        $session_id_to_destroy = $_SESSION['visit_user-session_id'];

        // close the current session.

        session_write_close();

        // load the specified target session 

        session_id($session_id_to_destroy);

        // start the target session.

        session_start();

        // clean all session data in target session.

        $_SESSION = [];

        // save and close that session.

        session_write_close();


        // Optional if you need to resume admin session:


        // reload admin session id

        session_id($admin_session);

        // restart admin session. . ..

        session_start();


        // ... 


        // header should go to a specific file. 

        header('Location: ../index.php');

        exit;

    }


查看完整回答
反对 回复 2021-11-05
  • 1 回答
  • 0 关注
  • 124 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信