最后再讲一下php cookie



我在过去两天里发布了几个关于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拦截器。

最新更新