【问题标题】:Hopefully one last one about php cookies希望最后一个关于 php cookie
【发布时间】:2011-11-06 09:59:15
【问题描述】:

在过去的两天里,我发布了几个关于 cookie 的问题。我几乎完成了我的家庭作业,但是遇到了一个问题。

我需要让我的用户有尽可能多的机会登录我网站的 cmets 部分,但是,如果他们在 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 1 应该保持不变,但是当我检查时,现在 cookie 1 的有效期与 cookie 2 相同。因此,这种情况下的所有 cookie 同时过期(这不好)。

我做错了什么?

【问题讨论】:

  • 一团糟!老兄,你真的应该考虑改变你正在使用的整个代码。
  • 设置一千个不同的 cookie 也没有意义。将尝试次数写入一个 cookie,然后检查该值。这实际上不会是防篡改,但更有意义。
  • 很公平,这是我第一次做这些事情。我知道制作一个名为 count 的 cookie,并检查它增加了多少次,但我如何检查用户在 30 秒内尝试了 5 次?用户可以在 15 秒内尝试 4 次,然后等待 30 秒,然后他们应该再次尝试 5 次。如果我只是数,没有办法告诉。
  • 对我来说就像一个楼梯大师!感谢锻炼! :D

标签: php cookies


【解决方案1】:
$attempts   = !empty($_COOKIE['attempts']) ? unserialize($_COOKIE['attempts']) : array();
$attempts[] = time();
$attempts   = array_slice($attempts, -5);

setcookie('attempts', serialize($attempts));

这为您提供了最近 5 次尝试及其时间戳的 FIFO 队列。 $attempts[0] 包含最早尝试的时间戳。这应该会为您提供所需的信息。

【讨论】:

  • 谢谢,太好了!那真好;那真甜。感谢您抽出宝贵的时间。虽然我从其他 cmets 了解到原始代码是糟糕的代码,但您能否向我解释一下为什么 cookie 会重写它们的到期时间?我只是好奇这是为什么?
  • @Phill 因为您总是重写 cookie。没有else
  • 哦该死,当然。谢谢你。我很感激。很明显。喜欢上面的答案,但如果我使用它,我的导师会想知道我是如何学习上述方法的。很确定他会弄清楚的。
【解决方案2】:

这不是一个很好的方法。您应该有一个会话计数器或一个 cookie 计数器。

此外,任何知道自己在做什么的人都可以绕过 cookie 和会话,因此您希望阻止该人的 IP 地址,而不仅仅是 cookie 阻止程序。

【讨论】:

  • 这是一个家庭作业,其唯一目的是确保我们可以使用 cookie。它与最佳实践、安全性等无关。只是一个练习。我不允许使用会话,我必须使用 cookie。这是对我的规则的明确规定。正如我之前所说,我可以使用计数器,但我如何检查用户在 30 秒内尝试了 5 次?用户可以每 10 秒尝试一次,并且只要他们愿意,就应该允许这样做。计数器不会告诉我们这一点。
  • 在这种情况下,使用一个包含失败尝试次数的 cookie。
  • 包含失败尝试次数的计数器只是一个计数器,它无法判断 30 秒内发生了多少次。这就是为什么我按照最初的方式进行操作的原因,它会检查以确保有失败的尝试,如果没有 4 次,它不会锁定。
  • 您可以告诉您的老师,使用会话与使用 cookie 是一回事,因为会话是使用 cookie 跟踪的。会话只是将服务器数据与小 cookie(客户端数据)分组的一种方式
猜你喜欢
  • 1970-01-01
  • 2021-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-08
相关资源
最近更新 更多