从其他用户销毁会话

雷夫勒

在更改了他的权限或他的禁令状态后,我尝试从其他用户销毁会话。

我将每个用户的会话密钥写入数据库,如果访问那里的个人档案,则会捕获他们。如果有任何更改,我希望用户立即被踢出系统...

这是我的代码:


    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

所以我想知道的是,我可以那样做吗,还是有另一种方法可以将其他用户踢出会话?

马丁

我尝试破坏其他用户的会话

是的,您可以从技术上做到这一点,但是这个过程很漫长且存在问题。

如何删除任意会话。

答:寻找会议

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

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

例:

ID58ce93c623376b3ddfca3cfc3a01d57d3be85084363147464ID的会话是位于以下位置的文件:

/ home / session_storage_folder / sess_58ce93c623376b3ddfca3fc3a01d57d3be85084363147464

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

如果您手动生成会话ID,则这将变得更加容易,但是会话的安全性将大大降低,并且如果没有非常仔细的考虑,则不应真的这样做

B:寻找用户

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

会话数据通常存储为:

(例)

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

alpha | s:28:“ UiOvMfV9byatH4Wt1SPYUO3zgsj5”; beta | i:1324;

哪一个

[var name] | [var type]:[var content length]:[contents data]; [等等....]

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

user_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;
    }

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章