首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >限制失败的登录尝试次数

问限制失败的登录尝试次数
EN

Stack Overflow用户
提问于 2011-06-15 20:22:13
回答 5查看 10.9K关注 0票数 5

我想限制失败的登录尝试。例如,如果一个特定的用户试图使用错误的用户名或密码登录4次,我应该第四次显示验证码,而不是阻止一段特定的时间,并继续显示验证码,除非他提供了有效的用户名和密码。用户成功登录后,登录尝试将重置为零。

从安全的角度来看,检查用户名而不是IP地址的想法可以吗?这种方法可以在不使用数据库的情况下实现吗?因为我认为我不需要存储时间,因为我将只显示recaptcha?请发表你的意见。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-06-15 20:31:13

你不想使用数据库的‘失败的登录次数’-检查?然后使用cookie并检查它。当然,他们可以移除它,但这是一个麻烦。

然而,,我怀疑你已经从数据库中获取了用户名和密码,为什么不同时获取最后一次登录失败的次数呢?

代码语言:javascript
复制
if (isset($_POST['submit_login'])) {

    if (isset($_POST['username']) && isset($_POST['password'])) {
        $username = mysql_real_escape_string($_POST['username']);
        $password = mysql_real_escape_string($_POST['password']);
        // id = unique primary key
        $rs = mysql_query('SELECT id,Username,Password,Failed_logins,IP_address FROM Users WHERE Username = '.$username.'');
        $num = mysql_num_rows($rs);
        if ($num > 0) {
            // I would add a password hash here to $password, and check against the hashed Password from the database
            // But let's check the clean passwords
            $row = mysql_fetch_array($rs);
            if ($password == $row['Password']) {
                // Successful login, set session or whatever you need
                // Reset failed logins
                mysql_query('UPDATE Users SET Failed_logins = 0 WHERE id = '.$row['id'].'');
                header('location: success.php');
            } else {
                // Failed password check
                if ($row['Failed_logins'] > 3) {
                    // Redirect to captcha
                    header('location: captcha.php');
                } else {
                    $ip = $_SERVER['REMOTE_ADDR'];
                    if ($row['IP_address'] != $ip) {
                        // New ip adress, reset failed logins
                        $failed_logins = 0;
                    } else {
                        // Increment failed logins
                        $failed_logins = $row['Failed_logins']+1;
                    }
                    mysql_query('UPDATE Users SET Failed_logins = '.$failed_logins.',IP_address = '.$ip.' WHERE id = '.$row['id'].' ');
                } // End check Failed_logins > 3
            }
        } else {
            // No such Username found in database
            $error = 'no_such_username';
        } // End username check from database

    } else {
        // Either username or password is missing
        $error = 'incomplete_form';
    } // end check for username and password

} // end main submit_login check

差不多吧。

编辑:

这是非常老的代码,我现在看到了一些问题。但是,至少您应该始终使用PDO (预准备语句)在数据库中插入数据。

票数 8
EN

Stack Overflow用户

发布于 2011-06-15 20:24:07

你在保护什么?

仅限用户的随机内容,用户名。

银行信息(我怀疑..)或其他敏感数据,IP可能是可以的,只要你使用范围。

你是在问怎么做,还是应该用哪种?

票数 1
EN

Stack Overflow用户

发布于 2011-06-15 20:26:53

您确实需要时间,否则如何确定登录尝试是否已过期?如果我在10年的时间跨度内4次登录失败,我将被屏蔽。您希望阻止那些在短时间内尝试多次登录的用户。

我建议您使用数据库,因为您将同时保留详细的登录历史记录。

要详细说明要实现哪种安全性:a组合!

  1. 使用对您的用户名的登录尝试来直接保护您的用户免受尝试。
  2. 使用ip地址信息来观察和检测,并在需要时采取措施。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6357609

复制
相关文章

相似问题

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