首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >5尝试日志记录页

5尝试日志记录页
EN

Stack Overflow用户
提问于 2015-01-05 13:07:22
回答 4查看 220关注 0票数 2

我在创造一个落日的暂停。在我的代码中,其他的东西都运行得很好。以下是我对超时的规范:

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

我仍然需要它来计时用户48小时,并显示一条消息让用户知道他们已经超时。如果你能帮我解决这个问题,我会非常感激的。下面是代码片段:

下面是登录尝试的代码片段:

代码语言:javascript
复制
        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"));
                }



        }

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-01-05 13:30:48

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

代码语言:javascript
复制
if (! (isset($pw_ok) && $pw_ok))

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

然后查询该日期的故障数,SQL应该如下所示:

代码语言:javascript
复制
$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";

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

票数 2
EN

Stack Overflow用户

发布于 2015-01-05 13:28:00

代码语言:javascript
复制
table
--------------------------
user_id | attempts | datetime

每次登录失败时,都会向尝试和更新日期时间添加一个。当用户正确登录时,您将更新db并将尝试设置为零。如果调度是相等或大于5,您首先检查日期时间,看看它是否大于24小时,如果是,您登录和重置调度,否则,您显示一条消息,不尝试登录。

票数 1
EN

Stack Overflow用户

发布于 2015-01-05 13:14:01

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27780213

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档