防止搜索滥用

时间:2013-03-21 00:21:21

标签: php search optimization bots

我无法谷歌在这个主题上有用的东西,所以我很欣赏链接到这个主题的文章,或者在这里直接回答,或者很好。

我正在一个拥有大量访问者的网站上实现PHP / MySQL搜索系统,因此我将对访问者允许在搜索字段中输入的字符长度实施一些限制两次搜索之间所需的最短时间。因为我对这些问题有点新意,而且我真的不知道"真正的原因"为什么通常这样做,只是我的假设是实现字符最小长度以最小化数据库将返回的结果数量,并且实现搜索之间的时间以防止机器人向搜索系统发送垃圾邮件并减慢速度网站。是吗?

最后,关于如何实现两次搜索之间的最短时间的问题。我用伪代码提出的解决方案就是这个

  1. 在提交搜索表单的网址处设置测试Cookie
  2. 将用户重定向到应输出搜索结果的网址
  3. 检查测试cookie是否存在
    • 如果没有,输出警告他不允许使用搜索系统(可能是机器人)
  4. 检查是否存在告知上次搜索时间的cookie
    • 如果这比5秒前少,请输出警告,他应该再等一下再搜索
  5. 搜索
  6. 将上次搜索时间设置为当前时间的Cookie
  7. 输出搜索结果
  8. 这是最好的方法吗?

    据我所知,这意味着已禁用Cookie的访问者将无法使用搜索系统,但这些日子真的存在问题吗?我无法找到2012年的统计数据,但我设法找到了数据,说2009年有3.7%的人禁用了cookie。这看起来不是很多,我想这些天应该可能更少。

2 个答案:

答案 0 :(得分:0)

“我的假设只是实现了字符最小长度,以最小化数据库将返回的结果数”。你的假设绝对正确。它通过强迫用户思考他们想要搜索的内容来减少潜在结果的数量。

对于向您的搜索发送垃圾邮件的机器人,您可以实施captcha,最常用的是recaptcha。如果您不想立即显示验证码,您可以跟踪(通过会话)用户提交搜索的次数,如果在特定时间范围内发生X次搜索,则渲染验证码。

我见过像SO和thechive.com这样的网站实现了这种类型的策略,其中验证码不会立即呈现,但如果遇到阈值则会呈现。

答案 1 :(得分:0)

这样您就无法将搜索引擎编入索引搜索结果的索引。更简洁的方法是:

  1. 获取搜索来源的IP
  2. 将该IP存储在缓存系统(例如memcached)和查询时间
  3. 如果另一个查询是从同一个IP发送的,那么通过的时间少于x秒,只需拒绝它或让用户等待
  4. 要提高性能,您可以做的另一件事是查看分析并查看最常出现的查询并缓存这些查询,以便在请求进入时提供缓存版本而不进行完整的数据库查询,解析,等...

    另一个天真的选择是让脚本每天运行1-2次,运行所有常见查询,并创建用户在进行特定搜索查询而不是点击数据库时所遇到的静态HTML文件。