【问题标题】:How do I protect against ajax-spam in PHP?如何防止 PHP 中的 ajax 垃圾邮件?
【发布时间】:2011-03-04 16:53:44
【问题描述】:

早安,

我想知道如何保护我的网站免受 ajax 垃圾邮件的侵害。我希望限制每个 ajax 操作 用户。假设每分钟 8 次 ajax 操作。

一个动作的例子是:添加/删除博客文章“作为我的最爱”的按钮。

除非我错了,否则我相信最好的方法是使用 $_SESSION 的变量并避免某人/机器人清除 cookie 以避免我的保护。我只允许登录用户使用 ajax 函数。

使用数据库会使我的保护失效,因为这是我试图避免的不需要的数据库写入。

我不得不提一下,我实际上使用 PHP 作为服务器语言并使用 jQuery 来进行我的 ajax 调用。

谢谢

编辑:

句子

...保护我的网站...

令人困惑,但这与跨域 ajax 无关。

2011-04-20 编辑: 我给它加了 50 的赏金。

【问题讨论】:

  • 我为什么不不断更改日期以接听更多电话?此外,cookie 不适用于大多数/所有机器人。如果我理解正确,我可以使用 PHP 的 curl 轻松绕过您的限制。
  • 基本上,您限制动作,每分钟 8 次,然后拒绝所有动作。这可能有效,即使我不确定限制您的用户使用 ajax 调用是最好的做法:) 没有人喜欢在使用网站时受到时间或数量的限制——我当然不会
  • @Kevin,我怀疑你可以自己更改日期:它是一个会话变量。此外,即使使用 cURL,您也必须发送与登录用户匹配的良好 sessionid,以便您可以继续执行任何操作。
  • 我的假设是这是某种 API。如果不是,我必须同意你的观点,除非有原因(比如作为游戏)。不过,在游戏的情况下,我会使用某种数据库跟踪来防止后门。
  • @Tsadiq,假设我有一个与此类似的页面,我想阻止用户向“收藏”按钮(开/关)发送垃圾邮件。

标签: php ajax spam-prevention


【解决方案1】:

由于您只允许对登录用户执行 AJAX 操作,因此这很容易解决。

  • 为每个帐户创建一个时间戳字段。您可以在数据库中执行此操作,或者利用 Memcached,或者使用平面文件。
  • 每次用户通过您的 AJAX 接口发出请求时,将当前时间戳添加到您的记录中,并且:
  • 检查以确保最后八个时间戳不是全部在一分钟前之前。

您可以从那里添加其他魔法,例如临时禁止公然违反速度限制的帐户,或将违规者的 IP 与已知垃圾邮件发送者的黑名单进行比较等。

【讨论】:

  • +1 好的解决方案。让我们等一下看看其他解决方案,但我怀疑它会大不相同。
  • @Cybrix,当然。作为附录,如果您发现您收到了很多被帐户限制模型捕获的粗俗 AJAX 请求,那么确保没有任何登录检查逻辑涉及复杂的数据库查询,例如总体上连接或多个查询。将过多的数据库开销暴露给会话检查等容易受到攻击的过程会使您容易受到 DDoS 攻击。
【解决方案2】:

您是在谈论针对您网站的特定 ajax-spam,还是一般的 ajax-spam?

如果是后者,您可以使用哈希来防止自动发送表单,即编写您的 hash() 单向函数,该函数接受字符串并对其进行 sha1-checksum。

这就是你使用它的方式:

// 该页面是一篇博客文章 #357 $id = 357; $type = '发布'; $hash = hash($_SERVER['REMOTE_ADDR'].$type.$id);

将该散列放在评论表单中的隐藏字段中,甚至隐藏在页面底部的某个div中,并将其命名为“control_hash”或其他名称。将其值附加到表单提交时的 ajax 请求。当脚本收到表单时,从$_REQUEST 数据(不包括现有的$control_hash)创建一个新的哈希并检查它们是否匹配。

如果表单是由bot提交的,它不会有$control_hash,所以不会通过。

【讨论】:

  • >> 如果表单是由bot提交的,它不会有$control_hash,所以不会通过。这是假设bot是通用的,并且不适合特定网站。这不是一个安全的假设。
  • @Kerin “当你假设的时候,你和我都是混蛋。”
  • ...是的,这或多或少是我所说的。另外我不知道如何取消您的评论,那是个意外。
  • 除了他一开始要求的基于时间的限制之外,您的哈希检查什么也没解决,也没有增加任何安全性。
  • @Kerin “没有意外。”我已经提到我在谈论一般的机器人。如果您运行的网站可能会成为专门定制的机器人的目标,那么您当然应该使用比哈希检查更复杂的安全方​​法,这就是this site 的问题。跨度>
【解决方案3】:

是的,原则上你的想法是好的。不过需要考虑的一些事项:

  • 如果您在全球范围内跟踪限制,那么您可能会遇到机器人 DoS 攻击您的服务器并阻止合法用户使用您的“收藏”按钮的问题。
  • 如果您根据请求的 IP 跟踪请求,那么有人可能会使用机器人网络(多个 IP)来绕过您的阻止。根据您的网站和您的偏好,可能会基于subnet of the IP 进行限制。
  • 安装并使用Memcache 来存储和跟踪请求,特别是如果您要基于IP 进行跟踪。这应该比使用会话变量更快(有人可能会纠正我)。

【讨论】:

  • 问:对于这样的事情,Memcache 比 APC 有什么好处? (如果有)
  • 我不知道具体细节,但我建议 Memcache 纯粹用于将值存储在内存中,而不是将它们写入会话文件。 AFAIK APC 做类似的事情,所以使用任何一个。
  • 我相信限制 ajax 最有效的方法是每个用户,而不是每个函数。
  • 感谢您的回复。我只是好奇为什么在这种情况下这是你的 goto 扩展。我认为这类似于我喜欢 Windex 而不是 Target 品牌。
  • @Kevin,哈哈。类似的东西。
【解决方案4】:

如果您可以访问该网站的源代码,您可以重写一些实际执行 AJAX 请求的 javascript 代码。 IE。您的页面可以有一个隐藏的计数器字段,每次用户单击按钮时都会递增。您还可以在页面上隐藏一个时间字段,以评估点击频率。

这个想法是,您甚至根本不必向服务器发送任何内容 - 只需在脚本内的客户端检查它即可。当然,这将无助于对抗直接访问服务器的机器人。

【讨论】:

    【解决方案5】:

    这真的取决于此类垃圾邮件的结果。如果您只是想避免写入数据库,所有这些检查最终可能会占用比实际写入数据库更多的资源。

    目的是否证明手段合理?

    您还必须判断此类垃圾邮件的可能性有多大。大多数机器人不是很聪明,当涉及到一些日志记录时会惨遭失败。

    只需我的 2 美分,其他答案完全有效,可以避免垃圾邮件。

    【讨论】:

      【解决方案6】:

      购买功能更强大的主机来满足请求,不要限制它们。 每分钟 8 个请求,这太荒谬了。
      无论如何,如果请求是“合法的”,您应该找到如何处理请求的方法,而不是如何限制它们。如果不是“合法的”,那就在没有任何“时间”限制的情况下拒绝他们。

      【讨论】:

        【解决方案7】:

        您可以使用带有全局变量的会话字段来保存上次 ajax 请求的时间。由于您希望允许 8 个请求,因此将其设为大小为 8 的数组并检查时间差异。如果它增加,(重要)它可能并不总是机器人。让用户有机会使用验证码或类似的东西。 (可能是数学问题?)

        验证验证码后,允许接下来的几篇帖子等。

        但请确保您正在检查该特定会话和用户。

        Kerin 的回答很好,我只是想强调一下验证码。

        【讨论】:

          【解决方案8】:

          是的,您需要在可以交互的每个函数视图中使用一个函数,而且,它应该在全局库中,以便您可以在任何地方使用它。

          if(is_logged_in())
          {
              // do you code here 
          }
          

          while is_logged in 定义如下

          function is_logged_in($activated = TRUE)
          {
              return $this->ci->session->userdata('status') === ($activated ? STATUS_ACTIVATED : STATUS_NOT_ACTIVATED);
          }
          

          您应该在用户登录成功时设置状态会话。

          【讨论】:

          • 它将如何帮助防止垃圾邮件伴侣?因为用户可以登录,然后将 cookie 传递给垃圾邮件脚本
          猜你喜欢
          • 1970-01-01
          • 2013-07-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多