使用cookies PHP跟踪登录尝试


Tracking login attempts using cookies PHP

我有一个家庭作业,我需要创建一个验证码登录到一个'评论'部分。

我有验证码工作正常,没有问题。我们还负责记录验证码失败的次数。没问题。

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

我知道如何跟踪5次失败的尝试,但你如何跟踪这一次的时间?如果用户在15秒内尝试了4次,然后等待一分钟(很明显是更短的时间),时钟将被重置,他们将再尝试5次。此外,如果他们尝试两次并等待30秒,尝试将再次尝试。

我是否需要设置一个时间cookie,一个次要计数cookie(与原始计数cookie一起),并跟踪次要计数器的开始,看看该计数器是否增加到5?你会怎么做呢?

编辑:

我必须道歉,显然我没有完全清楚我的情况。在这个家庭作业中,严格规定我们必须使用cookie来完成这个任务。在这一点上,我们并不关注最佳实践或安全性,讲师只是希望我们对cookie感到满意。不幸的是,会话对我来说不是一个选项,我必须使用cookie。

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

当然,通常的警告是成立的:在真正的安全系统中,攻击者在多次尝试中都不太可能维护会话cookie——他们会忽略它,迫使每次都创建一个新的空白会话。

我根本不会在cookie中这样做!用户可以很容易地绕过它,使您的系统非常不安全。

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

因为这是作业,所以没有代码给你!

在高层次上,你所需要做的就是存储时间戳而不是"count"。然后,对于每个请求,您可以丢弃超过30秒的时间戳,并计算其余的时间戳。

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

我将实现规范,而不会试图解释它。这会增加问题的复杂性。

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

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

下面是一些代码和伪代码。

<?
// 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
        // ...
    }

}
?>