在我更改了他的权限或他的禁令状态后,我尝试从其他用户销毁会话。
我将每个用户的会话密钥写入数据库,并在访问个人档案时捕获它们。如果有任何更改,我希望用户可以立即被踢出系统...
这是我的代码:
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
所以我想知道的是,我可以那样做吗,还是有另一种方法可以将其他用户踢出会话?
答案 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;
}