希望最后一个关于PHP cookie

时间:2011-11-06 01:36:59

标签: php cookies

我在过去两天发布了一些有关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都会同时到期(这并不好)。

我做错了什么?

2 个答案:

答案 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。