1 回答
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;
}
- 1 回答
- 0 关注
- 124 浏览
添加回答
举报