【问题标题】:How to effectively delete a user as an admin如何以管理员身份有效删除用户
【发布时间】:2019-05-04 03:35:46
【问题描述】:

当用户登录或注册时,我会存储一个会话和 cookie,并在数据库中插入一些详细信息。

登录/注册.php

$_SESSION['userid'] = $userid;
$selector = base64_encode(random_bytes(9));
$authenticator = random_bytes(33);
$token = hash('sha256', $authenticator);
$expires = date('Y-m-d\TH:i:s', time() + 864000);
$stmt2 = $pdo->prepare("INSERT INTO auth_tokens 
(selector,token,userid,expires) VALUES (:selector, :token, :userid, 
:expires)");
$stmt2->bindParam(':selector', $selector);
$stmt2->bindParam(':token', $token);
$stmt2->bindParam(':userid', $userid);
$stmt2->bindParam(':expires', $expires);
$stmt2->execute();

setcookie(
    'remember',
     $selector.':'.base64_encode($authenticator),
     time()+(86400 * 90),
     '/',
     false
);

现在,当用户单击注销时,我会销毁会话和 cookie

logout.php

session_start();
$_SESSION = array();
unset($_SESSION);
if (isset($_COOKIE['remember'])) {
unset($_COOKIE['remember']);
setcookie('remember', '', time() - 3600, '/'); // empty value and old 
timestamp
}
session_destroy();

作为管理员,我想在从自己的 End 删除用户时删除用户会话和 cookie。

现在当我使用这个删除数据库中的用户时

deleteuser.php

$stmt = $pdo->prepare("DELETE FROM users WHERE id=:uid");
$stmt->bindValue(':uid', $uid);
$stmt->execute();
if($stmt){ 
$stmt2 = $pdo->prepare("DELETE FROM auth_tokens WHERE userid=:uid");
$stmt2->bindValue(':uid', $uid);
$stmt2->execute();
}

当同一用户重新访问一个页面(index.php)时,我在页面顶部收到此错误

警告:hash_equals():预期 known_string 是一个字符串,在第 17 行的 C:\xampp\htdocs\book\php\function.php 中给出了 null

index.php

include('php/function.php');
getcookie();

function.php

if (!empty($_COOKIE['remember'])) {
list($selector, $authenticator) = explode(':', $_COOKIE['remember']);
$stmt = $pdo->prepare("SELECT * FROM auth_tokens WHERE selector=:selector");
$stmt->bindValue(':selector', $selector);
$stmt->execute();
$row = $stmt->fetch();

if (hash_equals($row['token'], hash('sha256',
base64_decode($authenticator)))) {
.....
}
}

function getcookie (){

if (!empty($_COOKIE['remember'])) {
    list($selector, $authenticator) = explode(':', $_COOKIE['remember']);
    $stmt = $pdo->prepare("SELECT * FROM auth_tokens WHERE 
 selector=:selector");
    $stmt->bindValue(':selector', $selector);
    $stmt->execute();
    $row = $stmt->fetch();
    $toke = $row['token'];
    $auth = hash('sha256', base64_decode($authenticator));       
    if (hash_equals($row['token'], hash('sha256',
    base64_decode($authenticator)))) {
    $userid = $row['userid'];
    // Then regenerate login token as above
    }
 }
}

如何调整这些代码,以便我可以通过结束用户会话和 cookie 来有效地从我的网站中删除用户。?

【问题讨论】:

    标签: php html session-cookies


    【解决方案1】:

    您无法删除用户的会话/cookie...但是您可以立即删除他们执行任何管理员操作的能力。

    如果在执行任何管理员级别操作之前在服务器上重新检查了用户的凭据(基于他们的 sessionID 或其他),那么他们的管理员状态实际上被禁用 - 然后您会将它们转移到非管理员屏幕同时。

    您可能会问:如果他们在我击杀他们时打开并激活了管理屏幕怎么办?对于静态屏幕,您几乎无能为力(他们可以截取屏幕截图 - 您无法阻止)。他们可以点击后退按钮,也许可以从缓存中查看屏幕。但是

    一些可能的解决方案是:

    (a) 使用带有 setInterval(或递归 setTimeout)函数的 ajax,每 X 秒/分钟重新检查一次服务器的管理员凭据。然后,即使他们是 afk,他们也可以从管理屏幕中注销。 (当然,精明的用户可以通过在 DevTools 中进行猴子来停止此方法。)

    (b) 在执行任何管理操作之前,都会重新检查他们的信用。如果他们不再是管理员,则拒绝该操作,并且他们将返回到非管理员屏幕。精明的用户不会干扰此方法。

    这不会给所有事情带来明显的延迟吗?

    没有。重新检查凭据就像在数据库中实时检查他们的用户权限状态一样简单。

    当您取消管理它们时,您将更改它们的 priv 级别,因此每当用户尝试从该管理屏幕执行某项操作时,都会立即获取该权限。除非你有几千个用户,否则不要担心这样做的开销。即使有数千名用户,它仍然可能是处理此事的一种不错的方式。无论如何,此时您正在与服务器通信,并且在每个管理操作功能中,只需插入一个快速检查以“验证管理状态” - 所以它只是服务器上与自己的数据库通信的后端代码。超级快。

    【讨论】:

    • 我是网站上唯一的管理员。我只是想删除一个普通用户。您能否分享有关如何检查该用户会话或 cookie 是否仍然存在于我的数据库中的代码......以及如何摆脱它以及如何摆脱该错误 - hash_equals(): Expected known_string to be a string,空给定。它返回一个空值。
    • 你的服务器端配置是什么?是 PHP / MySQL 吗?共享服务器或私人服务器或 VPS 或?如果与 MySQL 共享服务器,那么您可以使用 PHPMyAdmin(来自 CPANEL)查看数据库表。如果是 VPS 或私有,它是基于 Linux 的 LAMP 堆栈,还是 Micro$oft?如果是 Linux,您应该有 PHPMyAdmin 应用程序,您可以使用它直接查看表格。要检查数据库,您可以使用代码 - 或者 - 您可以直接通过查看表格、使用 PHPMyAdmin 或等效工具来执行此操作。
    • 再次查看您的问题,您有 PHP 并且可能正在使用 MySQL(又名 MariaDb)。因此,使用 PHPMyAdmin 并在 users 表中查找他的 userid,然后在 auth_tokens 表中查找具有相同 user_id 的 auth_token。用他的 user_id 删除所有 auth_tokens。无需编写代码来执行此操作,只需使用 PHPMyAdmin 自己完成即可。如果您不熟悉,您可以在本地机器上安装 xampp(安装 Apache Web 服务器、PHP、MySQL、PHPMyAdmin 等)并使用它。做一个使用 PHP 和 MySQL 创建登录系统的教程 - 你将在几个小时内成为专家。
    猜你喜欢
    • 2014-06-15
    • 1970-01-01
    • 2017-05-14
    • 1970-01-01
    • 2015-05-23
    • 1970-01-01
    • 1970-01-01
    • 2017-05-27
    • 1970-01-01
    相关资源
    最近更新 更多