我已经完成了一项家庭作业,我需要创建一个验证码来登录“评论”部分。
我的验证码工作正常,没问题。我们的任务还包括对验证码的失败尝试进行计数。没问题。
这是我的问题。我们被告知用户可以按照自己的意愿尝试多次,但是,如果他们在30秒限制内失败5次,他们将被锁定3分钟。
我理解如何跟踪5次错失尝试,但您如何跟踪此次尝试的时间?如果用户在15秒内尝试了4次,然后等待了一分钟(或更少,显然),则重置时钟,并且还有5次尝试。此外,如果他们尝试了两次并等了30秒,那么尝试会再次尝试。
我是否需要设置时间cookie,辅助计数cookie(与原始计数cookie一起使用),并跟踪辅助计数器的开始,然后查看该计数器是否增加到5?你会怎么做?
编辑:
不得不道歉,显然我对自己的情况并不完全清楚。在这个家庭作业中,严格规定我们必须使用cookie来完成这项任务。我们此时并未考虑最佳实践或安全性,教师只是希望我们对cookie感到满意。不幸的是,会话不是我的选择,我必须使用cookies。
答案 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
// ...
}
}
?>