使用Cookie PHP跟踪登录尝试

时间:2011-11-05 04:56:41

标签: php cookies

我已经完成了一项家庭作业,我需要创建一个验证码来登录“评论”部分。

我的验证码工作正常,没问题。我们的任务还包括对验证码的失败尝试进行计数。没问题。

这是我的问题。我们被告知用户可以按照自己的意愿尝试多次,但是,如果他们在30秒限制内失败5次,他们将被锁定3分钟。

我理解如何跟踪5次错失尝试,但您如何跟踪此次尝试的时间?如果用户在15秒内尝试了4次,然后等待了一分钟(或更少,显然),则重置时钟,并且还有5次尝试。此外,如果他们尝试了两次并等了30秒,那么尝试会再次尝试。

我是否需要设置时间cookie,辅助计数cookie(与原始计数cookie一起使用),并跟踪辅助计数器的开始,然后查看该计数器是否增加到5?你会怎么做?

编辑:

不得不道歉,显然我对自己的情况并不完全清楚。在这个家庭作业中,严格规定我们必须使用cookie来完成这项任务。我们此时并未考虑最佳实践或安全性,教师只是希望我们对cookie感到满意。不幸的是,会话不是我的选择,我必须使用cookies。

6 个答案:

答案 0 :(得分:3)

鉴于您已将其标记为PHP,只需使用session_start()启动会话即可。这通过cookie为每个用户提供唯一ID,您可以将他们的登录尝试存储在服务器上的$_SESSION阵列中。在每次登录尝试时,您都可以检查存储在会话中的记录尝试,看看它们是否超过了允许的尝试率。

当然,通常的警告仍然存在:在真正的安全系统中,攻击者很可能不会在多次尝试中维护该会话cookie - 他们会忽略它,强制每次都创建一个新的空白会话。

答案 1 :(得分:2)

我根本不会在cookies中这样做!用户可以轻松避开这种情况,使您的系统非常不安全。

您应该记录数据库中的每次登录尝试。然后,只需查询尝试登录时在指定时间段内进行的尝试。如果他们已经经常尝试,请不要让他们进去。

答案 2 :(得分:2)

因为这是家庭作业,所以没有代码!

在高级别,您需要做的就是存储时间戳而不是“计数”。然后,在每个请求中,您可以丢弃超过30秒的时间戳并计算其余时间。

答案 3 :(得分:1)

应该在服务器端处理保护您的系统免受恶意用户攻击的问题。您可以使用IP和用户名的组合尝试登录以为该个人构建唯一标识符。如果凭据组合尝试强制登录,则将该个人阻止5分钟。

答案 4 :(得分:0)

我会按原样实现规范,不会尝试解释它。这会增加问题的复杂性。

为了实现我建议使用会话或服务器端日志而不是处理手工制作的cookie。在每次身份验证检查最后5次尝试之前,您可以保留用户每次登录尝试的时间。如果第一个值时间小于30秒,则提醒用户并禁用登录表单5分钟。您可以在用户会话中存储解锁表单的时间(通过将等待的秒数添加到上次尝试失败的时间),因此如果服务器的时间小于解锁,则每个登录表单请求都将失败时间。解锁表单后,删除用户会话上的解锁时间戳,然后重新启用表单。

答案 5 :(得分:0)

我会将每个失败的尝试记录为会话中的数组。

这是一些代码和伪代码。

<?
// Check if they are locked out.
if ($_SESSION['lockedOutTime'] < (time() - (3*60))) {

    // they are locked out; don't attempt login

    // notify them that they are still locked out



// If they aren't locked out, allow them to attemp the login
} else {

    // Attempt login
    // ...

    // if failed... log it
    $_SESSION['failedLoginAttempts'][] = time();

    $thirtySecondsAgo = time();
    $failedAttemptsInTheLastThirtySeconds = 0;


    // count failed login attempts in the last 30 seconds
    foreach ($_SESSION['failedLoginAttempts'] as $failedAttempTime) {

        if ($failedAttempTime >= $thirtySecondsAgo) {

            $failedAttemptsInTheLastThirtySeconds++;

        }

    }

    // Check if they are over the limit
    if ($failedAttemptsInTheLastThirtySeconds >= 5) {

        // lock em out
        $_SESSION['lockedOutTime'] = time();

        // Notify user they have been locked out
        // ...

    }



}

?>