我在过去两天发布了一些有关Cookie的问题。我几乎完成了我的家庭作业,但我遇到了问题。
我需要允许我的用户尽可能多地登录我网站的评论部分,但是,如果他们在30秒内失败5次尝试,他们将被锁定3分钟。为了计算5次尝试,我做了这个:
if(isset($_COOKIE['cookie1'])){
if(isset($_COOKIE['cookie2'])){
if(isset($_COOKIE['cookie3'])){
if(isset($_COOKIE['cookie4'])){
header('Location: reading_cat.php');
setcookie("locked_out", "cookie", time()+180);
}setcookie("cookie4", "cookie4", time()+30);
}setcookie("cookie3", "cookie3", time()+30);
}setcookie("cookie2", "cookie2", time()+30);
}setcookie("cookie1", "cookie1", time()+30);
除了一个问题外,这很有效。当用户尝试失败时,会设置cookie。如果他尝试2失败,则检查cookie 1,如果存在cookie 2,则打开。在这种情况下,每次添加连续cookie时,由于某种原因,所有cookie的有效期都写入添加的最后一个cookie的时间。
要改述:cookie 1在6:00添加,没有秒,并且它的到期时间是6:00和30秒。 Cookie 2在6:00和15秒添加,到期时间为6:00和45秒。我认为cookie应该保持不变,但是当我检查时,现在cookie一个与cookie 2相同的到期时间。因此,此场景中的所有cookie都会同时到期(这并不好)。
我做错了什么?
答案 0 :(得分:2)
$attempts = !empty($_COOKIE['attempts']) ? unserialize($_COOKIE['attempts']) : array();
$attempts[] = time();
$attempts = array_slice($attempts, -5);
setcookie('attempts', serialize($attempts));
这为您提供了最近5次尝试的FIFO队列及其时间戳。 $attempts[0]
包含最早尝试的时间戳。这应该为您提供所需的信息。
答案 1 :(得分:1)
这不是一个很好的方法。你应该有一个会话计数器或一个cookie计数器。
此外,任何知道自己在做什么的人都可以绕过cookie和会话,所以你想要阻止那些人的IP地址,而不仅仅是阻止cookie。