【问题标题】:5 attempt logging page5 次尝试记录页面
【发布时间】:2015-03-03 00:44:54
【问题描述】:

我正在创建一个登录超时。我的代码上的其他一切都运行良好。这是我对超时的规范:

  • 如果用户在 24 小时内输入密码错误 5 次,则将其锁定 48 小时。
  • 如果用户在 5 次尝试和 24 小时内正确输入密码,则重置他们的尝试。

我仍然需要它来让用户超时 48 小时,并显示一条消息让用户知道他们已经超时。如果你能帮我解决这个问题,我将不胜感激。这是代码sn-p:

这是登录尝试的代码的 sn-p:

        if (!$pw_ok)    {
            if (isset($_SERVER["REMOTE_ADDR"])) {
                    $str_RemoteHost = $_SERVER["REMOTE_ADDR"];
                } else {
                    $str_RemoteHost = '';
                }

                $qry_WriteToDatabase = "    INSERT INTO cms_user_login_attempts
                                        (
                                            cula_user_id,
                                            cula_date_time,
                                            cula_remote_host,
                                            cula_attempt_count
                                        )
                            VALUES          (
                                            " . $db->SQLString($row->user_id) . ",
                                            Now(),
                                            " . $db->SQLString($str_RemoteHost, true) . ",
                                            'cula_attempt_count'
                                        )";
                $db->query($qry_WriteToDatabase);

                $qry_UpdateCount = "    UPDATE 
                                            cms_user_login_attempts
                                        SET 
                                            cula_attempt_count = cula_attempt_count + 1
                                        WHERE 
                                            cula_user_id = " . $db->SQLString($row->user_id) . " ";
                $db->query($qry_UpdateCount);                           



                $qry_CheckDatabase = "  SELECT 
                                            CASE WHEN count(*) >= 5 THEN 0 ELSE 1 END as allowed_login 
                                        FROM
                                            cms_user_login_attempts
                                        WHERE
                                            cula_date_time >= DATE_SUB(CURRENT_TIMESTAMP, interval 48 hour) 
                                        AND 
                                            cula_user_id = " . $db->SQLString($row->user_id) . "";
                $rs_CheckDatabase = $db->query($qry_CheckDatabase);

                if (! (isset($qry_CheckDatabase) && $qry_CheckDatabase)) {
                $errors->defineError("invalid_user_pass", "Bleh.", array("username","password"));
                }



        }

编辑:我已经更新了问题和代码。

【问题讨论】:

  • 您的问题缺乏针对性。
  • “如果用户在 5 次尝试中输入了正确的密码,我希望为该用户重置尝试。” - 更新有问题的行WHERE 子句。
  • 具体是什么不起作用?你已经向我们描述了你想要做什么,但你没有解释你遇到的问题。
  • 乍一看为什么$_SERVER["REMOTE_ADDR"]会参与其中? a) 它不可靠 b) 断开与 isp 的连接以刷新 IP 地址并重试
  • @andrew,为了让他免于怀疑,代码中没有任何逻辑暗示他正在查看 REMOTE_ADDR 以确定它是否是同一用户。他可能希望它在那里仅用于记录目的。

标签: php mysql


【解决方案1】:

您需要在密码验证之前保存登录尝试

if (! (isset($pw_ok) && $pw_ok))

因此,添加一个名为cula_login_success 的布尔字段来指示密码验证是否成功。

然后查询该日期的失败次数,SQL应该是这样的:

$qry="select cula_user_id,count(*) from cms_user_login_attempts where DATEDIFF(cula_date_time,NOW())<=2 and cula_user_id=".$db->SQLString($row->user_id)+" and not exist(select cula_user_id from cms_user_login_attempts where  DATEDIFF(cula_date_time,NOW())<=2 and cula_user_id=".$db->SQLString($row->user_id)+" and cula_login_success=1) group by cula_user_id having count(*)>5";

此查询应该返回一个空集,如果没有 - 那么这意味着您的用户在 2 天内尝试登录不成功超过 5 次,中间没有成功登录

【讨论】:

  • 你能给我一个布尔字段 cula_login_success 的例子
  • 布尔表示True/False(或者01
  • 您好,如果您仍然能够帮助我,我已经更新了我的代码。我的代码有点问题,它正在向数据库添加失败的尝试,但它只为该用户更新一行,其余行没有被更新。
  • 请选择一个答案,然后发布另一个问题。未来阅读此页面的人将不知道发生了什么
【解决方案2】:
table
--------------------------
user_id | attempts | datetime

每次登录失败时,您都会添加一个尝试并更新日期时间。 当用户正确登录时,您更新数据库并将尝试设置为零。 如果 attemts 等于或大于 5,您首先检查日期时间以查看其是否大于 24 小时,如果是,则登录并重置 attemts,否则您会显示一条消息并且不要尝试登录。

【讨论】:

  • 这正是我想要做的,但我在实际编写代码时遇到了麻烦,你能帮我解决这个问题吗?
  • 首先创建一个新表或调整已有的表。然后开始编写一些代码。我可以帮你,但我不会为你写。
  • 好的我已经调整了表格,它现在有 cula_id、cula_user_id、cula_date_time、cula_remote_host、cula_attempt_count 等字段。我现在有了它,如果输入错误的密码,它现在将其写入数据库,记录 user_id。
  • 没有写入cula_attempt_count,只需要弄清楚如何让程序计算登录尝试并将其放入数据库。
  • 您需要使用给定的 user_id 更新行。比如:更新表名设置尝试=尝试+1,其中用户ID=?;
【解决方案3】:

在您的表格中,您应该记录尝试是否成功。然后,在再次加载表单之前,检查用户在过去 24 小时内是否有 5 次不成功的尝试,并决定是锁定帐户还是让用户重试。

【讨论】:

  • Atm 我有它,以便它记录登录尝试,如果它是坏的。我只需要代码来检查 24 小时内的尝试次数。如果密码在 5 次尝试内正确输入,则重置尝试次数。
【解决方案4】:

不要那样做...... 如果有人会询问用户名,他可以很容易地对该人进行 DDOS。 最好延迟登录。喜欢 - 如果在检查登录之前错误的登录计数很高(对您来说超过 5 个),请使用睡眠 10 秒。这将减缓攻击,但仍允许真实用户登录。 如果有很多失败的登录(20-30)然后阻止帐户几分钟,并禁止 ip 一个小时左右。 这样您的用户将能够登录,而攻击者将被阻止。

【讨论】:

  • 我想在实际操作之前先了解如何操作。感谢您的提示。
猜你喜欢
  • 2016-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-10
  • 1970-01-01
  • 1970-01-01
  • 2013-09-23
相关资源
最近更新 更多