5 次尝试登录页面

5 attempt logging page

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

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

这是登录尝试的代码片段:

        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"));
                }



        }

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

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

table
--------------------------
user_id | attempts | datetime

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

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

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";

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

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