破坏其他用户的会话

时间:2019-07-31 08:49:12

标签: php

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

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

这是我的代码:


    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 个答案:

答案 0 :(得分:1)

  

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

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

如何删除任意会话。

A:查找会话

您需要使用session_id值。此值是文件名的一部分(如果是数据库会话,则为会话标识符列的值)。

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

示例:

标识为58ce93c623376b3ddfca3cfc3a01d57d3be85084363147464的会话是位于以下位置的文件:

  

/ home / session_storage_folder / sess_58ce93c623376b3ddfca3fc3a01d57d3be85084363147464

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

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

B:查找用户

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

会话数据通常存储为:

(示例)

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

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

哪个

  

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

因此,如果您将user id的值设置为$_SESSION['user_id'] = 45;,则将是:

  

user_id | i:45;

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

Please read this question about how to do this

所以您将拥有如下代码:

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