【问题标题】:How to show user suspended reason?如何显示用户暂停原因?
【发布时间】:2015-03-15 22:44:51
【问题描述】:

我有一个付费点击脚本,在这个脚本中,我们可以选择暂停会员,当该会员尝试使用他们的用户名和密码登录他的帐户并立即单击登录按钮时,我们的系统会向他显示一个错误:“您的帐户已暂停”。

但我想向每个用户显示暂停的原因。我的意思是当我暂停任何用户时,我会写下他被暂停的原因,然后当该用户尝试登录他的帐户时,我们的系统会向他显示错误(您的帐户被暂停)然后换行,我想在那里告诉他原因。

我已经在成员表中创建了一个名为“susreason”的列,并且我已经将它显示给我的管理面板,以显示每个用户编辑选项和暂停选项。现在,当我暂停用户并写入暂停原因时,用户成功暂停,但系统没有显示原因,因为用户会话未登录。

下面是代码,在我的 login.php 中:

$username = $db->real_escape_string($input->pc['username']);
    $password = $input->p['password'];
    $country = ip2country($_SERVER['REMOTE_ADDR']);
    $ip_user = $_SERVER['REMOTE_ADDR'];
    $sect = explode(".", $ip_user);
    $reip = ((($sect[0] . ".") . $sect[1] . ".") . $sect[2] . ".") . $sect[3];
    $reipa = (($sect[0] . ".") . $sect[1] . ".") . $sect[2] . ".*";
    $reipb = ($sect[0] . ".") . $sect[1] . ".*.*";
    $reipc = $sect[0] . ".*.*.*";
    $verifyusername = $db->fetchOne(("SELECT COUNT(*) AS NUM FROM blacklist WHERE type='username' AND criteria='" . $username . "'"));
    $ipban1 = $db->fetchOne(("SELECT COUNT(*) AS NUM FROM blacklist WHERE type='ip' AND criteria='" . $reip . "'"));
    $ipban2 = $db->fetchOne(("SELECT COUNT(*) AS NUM FROM blacklist WHERE type='ip' AND criteria='" . $reipa . "'"));
    $ipban3 = $db->fetchOne(("SELECT COUNT(*) AS NUM FROM blacklist WHERE type='ip' AND criteria='" . $reipb . "'"));
    $ipban4 = $db->fetchOne(("SELECT COUNT(*) AS NUM FROM blacklist WHERE type='ip' AND criteria='" . $reipc . "'"));
    $countryban = $db->fetchOne(("SELECT COUNT(*) AS NUM FROM blacklist WHERE type='country' AND criteria='" . $country . "'"));

    if ($verifyusername != 0) {
        serveranswer(0, $lang['txt']['usernameblocked']);
    }
    else {
        if ((($ipban1 != 0 || $ipban2 != 0) || $ipban3 != 0) || $ipban4 != 0) {
            serveranswer(0, $lang['txt']['ipblocked']);
        }
        else {
            if ($countryban != 0) {
                serveranswer(0, $lang['txt']['countryblocked']);
            }
        }
    }

    $verifyuser = $db->fetchOne(("SELECT COUNT(*) AS NUM FROM members WHERE username='" . $username . "'"));

    if ($verifyuser == 0) {
        serveranswer(0, $lang['txt']['invalidlogindetails']);
    }

    $user_info = $db->fetchRow(("SELECT id, username, password, status, country FROM members WHERE username='" . $username . "'"));

    if ($user_info['password'] != md5($password)) {
        $bid = array("user_id" => $user_info['id'], "ip" => $ip_user, "status" => "Failed", "password" => $password, "date" => TIMENOW, "agent" => (!empty($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : $_ENV['HTTP_USER_AGENT']));
        $upd = $db->insert("login_history", $bid);
        serveranswer(0, $lang['txt']['invalidlogindetails']);
    }


    if ($settings['multi_login'] == "yes") {
        $checkip = $db->fetchOne("SELECT COUNT(*) AS NUM FROM members WHERE last_ip='" . $ip_user . "' AND id!=" . $user_info['id']);

        if ($checkip != 0) {
            $showip_error = "yes";
        }


        if ($showip_error == "yes") {
            serveranswer(0, $lang['txt']['multipleaccountsdetected']);
        }
    }


    if ($settings['multi_country'] == "yes") {
        if ($country != $user_info['country'] && $country != "-") {
            serveranswer(0, $lang['txt']['multiplecountrydetected']);
        }
    }


    if ($user_info['status'] == "Un-verified") {
        serveranswer(0, $lang['txt']['accountinactive']);
    }
    else {
        if ($user_info['status'] == "Suspended") {
        serveranswer(0, "<strong>Your Account has been Suspended</strong>" . "<br />" . "<div class=\"site_content\"><div class=\"info_box\"><strong>Reason of Suspend</strong>" . "<br />" . $user_info['susreason']);
        }
    }

这段代码最后一行是(if)语句,当用户暂停时,系统将执行。

【问题讨论】:

  • 您说用户必须登录才能显示暂停原因。但这意味着只有当用户登录时才能访问您的用户表。我认为即使会话中没有用户数据,您也可以从中读取,不是吗?
  • $user_info 不是来自会话 - 只是来自对用户名的数据库查找。做一些调试,看看为什么这没有出现在你面前。
  • @Giorgio 我不是说你在说用户必须登录才能显示暂停原因我说我的脚本向用户显示暂停错误,即使用户没有登录这就是它的原因没有向暂停用户显示“susreason”列的值。
  • 这个原因是我在暂停用户时写的,我写了一些类似原因的东西,并且这个值提交给成员列“susreason”,但是当他暂停时脚本没有向暂停用户显示这个值尝试登录。脚本只显示暂停和 ($user_info['susreason']) 这将不起作用,因为用户未登录此字段显示空白。
  • @halfer 你是对的,但我不是 php 方面的专家,我不知道如何调试我正在尝试对以下代码进行一些更改,然后向我展示 susreason 0 。

标签: php session


【解决方案1】:

此代码存在一些安全问题,因此虽然这不是问题的直接答案,但我将它们写出来作为答案,因为它们很重要。

  • 使用 MD5 散列的密码。多年来,这一直不是一种可接受的哈希算法,因为它太快并且容易进行暴力搜索。
  • 没有哈希盐腌。这使您的密码容易被彩虹表查询。

您应该改用password_hash(),这将解决这两个问题。这使用了一个缓慢的算法(目前是 Bcrypt),随着新 PHP 版本的发布,速度会增加(以补偿 CPU 性能的普遍提高,使得暴力尝试大量密码变得更加困难)。它还将生成并存储盐作为哈希输出的一部分。

看起来用户需要在被告知暂停原因之前立即获取其用户名和密码。这很好 - 在大多数情况下,如果某人仅拥有用户名(通常是公共信息),您不希望人们确定他们被停职的原因。

【讨论】:

  • 你的回答完全不符合我的问题。我没听明白你在说什么。
  • 你有什么不明白的,@JackVale?你有一些安全问题,知道它们是什么对你有好处。
  • 我亲爱的@halfer 我只是想向被暂停的用户显示暂停原因,我已经把暂停用户的时间和这个原因值保存在表(成员)中列(susreason)当我的脚本向用户显示您被暂停的错误时,我想在登录时向用户显示此列值。
  • 有关更多详细信息,您可以阅读我在问题方面提交的其他 cmet。
猜你喜欢
  • 2011-10-07
  • 1970-01-01
  • 2021-01-02
  • 1970-01-01
  • 2016-05-09
  • 1970-01-01
  • 2015-12-14
  • 2021-04-27
  • 1970-01-01
相关资源
最近更新 更多