我在过去两天里发布了几个关于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点添加的,没有秒,它的有效期是6点30秒。曲奇2在6点15秒添加,6点45秒过期。我认为饼干1应该保持不变,但当我检查时,现在饼干1和饼干2有相同的有效期。因此,此场景中的所有cookie将同时过期(这是不好的)。
我做错了什么?
$attempts = !empty($_COOKIE['attempts']) ? unserialize($_COOKIE['attempts']) : array();
$attempts[] = time();
$attempts = array_slice($attempts, -5);
setcookie('attempts', serialize($attempts));
这为您提供了最近5次尝试及其时间戳的FIFO队列。$attempts[0]
包含最早尝试的时间戳。
这不是一个很好的方法。你应该有一个会话计数器或一个cookie计数器。
而且,任何知道自己在做什么的人都可以绕过cookie和会话,所以你想要阻止那个人的IP地址,而不仅仅是一个cookie拦截器。