【问题标题】:Limit form submission rate限制表单提交率
【发布时间】:2011-12-10 11:04:33
【问题描述】:

在我的新网站上,我想通过将用户限制为每小时最多 2 个帖子来减少垃圾邮件(这可能会更改为允许更多,但现在是 2 个)我设计了一种使用 cookie 的方法,但是,出于某种原因该网站没有设置 cookie,这是我的 cookie 代码:

    $sql = "INSERT INTO mysql_table (timestamp,entry,uid,allowcomments) VALUES ('$timestamp','$entry','".rndTxt(16)."','$allowcommenting')";

    $result = mysql_query($sql) or print ("Can't insert into table.<br />" . $sql . "<br />" . mysql_error());

   if ($result != false) {

        if(isset($_COOKIE['AnonPost']))
        {
        $hour = time() + 3600; 
        setcookie("AnonPost", "2", $hour); 
        }

        else {
        $hour = time() + 3600; 
        setcookie("AnonPost", "1", $hour); 
        }

        print "<meta HTTP-EQUIV='REFRESH' content='0; url=index.php'>";
    }

     mysql_close();

然后后面的 if/else 语句检查它是否存在,以及值是什么(如果它不存在,他们会正常查看站点,如果存在并且 val=1 则显示一条消息说只剩下一个帖子,如果 val=2,他们会收到一条消息,说他们这个小时的帖子已经用完了。)

这适用于我的本地主机,但不适用于网站本身 (http://aviatex14.co.uk/anonpost/) 有什么想法吗?

除此之外,我知道这不是限制帖子的最佳方式,所以,谁能帮我限制表单提交,或者就我的 cookie 问题给我建议?

【问题讨论】:

  • 您可能想寻找更好的方法来处理垃圾邮件。限制每小时发布的帖子比垃圾邮件发送者更会阻碍真实用户。
  • 另外,cookie 可以很容易地删除。
  • 嗯,我想到了,但这是暂时的,因为我们整理了更大的东西。我想知道,您是否认为将其限制为更像您必须在每次发布后等待 60/120 秒才能再次发布的 php 会话会起作用?更重要的是阻止人类垃圾邮件发送者持续发帖
  • 你怎么知道他们是人类而不是机器人?
  • 我已经有一个系统可以阻止机器人,那些突破过滤器的可以单独处理,但是人类可以完成反垃圾邮件,然后发布,并且可以继续这样做。这就是我需要限制的。

标签: php mysql forms cookies limit


【解决方案1】:

减少垃圾邮件有很多方法

验证码系统。 http://www.google.com/recaptcha

帐户创建期间的电子邮件确认。

发布期间的垃圾邮件识别。查找垃圾关键字。

表单中的蜜罐字段。这使用 CSS 隐藏每个表单上的蜜罐输入字段。如果请求到达并填写了该字段的服务器,则您知道机器人提交了表单并且可以忽略该请求。

声誉系统,如堆栈交换中的系统。只有在用户建立了一定的声誉后,您才允许他们做某些事情。

【讨论】:

  • 很棒的帖子,我要补充一点,蜜罐应该是随机的 $_SESSION 数组之外的东西,因此机器人不能只向 $_POST 发送变量。
【解决方案2】:

注意事项 1:为了设置 cookie,需要在任何 HTML 发送到页面之前完成(因此它必须与 session_start 一起位于脚本的顶部)。

注意事项 2:说到 session_start,您可能需要考虑设置一个 $_SESSION 变量,而不是设置一个 cookie。

  • 它们更易于使用和处理
  • 用户无法修改它们,除了破坏 php 会话 cookie(但随后他们将重新登录,您可以在此时再次检查)
  • 您可以在会话开始后的任何时候设置/修改/删除它们,而不是记住在调用“print”、“printf”或“echo”之前设置 cookie
  • 您正在降低标头带宽 - 总是一件好事

【讨论】:

  • 不一定必须在脚本的顶部,正如您所说,在响应正文之前。您可以使用输出缓冲来允许在任何地方设置 cookie 和其他标头(尽管出于性能原因应尽可能避免这样做)。
  • 当然。我不想让它听起来像是需要做的第一件事,但是,很多时候,这是某人认为他们有时间的罪魁祸首,并且 4 包括在某个地方有打印或回声。并且缓冲会起作用,但对于一个小任务来说这是一个很大的飞跃。
  • 呵呵呵呵,说的很对。我以前肯定被那个烧过:)
【解决方案3】:

使用 cookie(因为它存储在客户端)不是设置限制的安全方法。用户将能够轻松更改它,因此您应该尝试使用服务器端方法。

在这里,您可以简单地计算数据库中用户的帖子。这样的事情会给你一个用户在过去一小时内的帖子数量:

select count(*) from mysql_table where uid='$uid' and timestamp > (DATE_ADD(now(), INTERVAL -1 HOUR););

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-31
    • 2021-09-30
    • 1970-01-01
    • 1970-01-01
    • 2015-12-18
    • 1970-01-01
    • 1970-01-01
    • 2017-05-08
    相关资源
    最近更新 更多