2

什么是最好的做法是不要用洪水限制惹恼用户,但阻止机器人进行自动搜索?

到底是怎么回事:

我更加意识到奇怪的搜索行为,我终于有时间去了解它是谁。它是 157.55.39.*,也称为 Bing。这很奇怪,因为当检测到 _GET['q'] 时,会添加 noindex。

然而问题是,他们正在减慢 SQL 服务器的速度,因为有太多的请求实例进入。

到目前为止我做了什么:

我已经实施了搜索洪水限制。但是,由于我使用会话 cookie 执行此操作,因此从上次搜索时间戳检查和计算 - bing 显然会忽略 cookie 并继续。

最坏的情况是添加 reCAPTHA,但我不想要“你是人类吗?” 每次搜索时的复选框。它应该仅在检测到洪水时出现。所以基本上,真正的问题是,如何检测来自客户端的太多请求以触发某种重新验证以停止请求。

编辑#1:
我目前处理的情况是:

<?

# Get end IP
define('CLIENT_IP', (filter_var(@$_SERVER['HTTP_X_FORWARDED_IP'], FILTER_VALIDATE_IP) ? @$_SERVER['HTTP_X_FORWARDED_IP'] : (filter_var(@$_SERVER['HTTP_X_FORWARDED_FOR'], FILTER_VALIDATE_IP) ? @$_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR'])));

# Detect BING:
if (substr(CLIENT_IP, 0, strrpos(CLIENT_IP, '.')) == '157.55.39') {

    # Tell them not right now:
    Header('HTTP/1.1 503 Service Temporarily Unavailable');

    # ..and block the request
    die();
}

有用。但这似乎是解决更系统问题的另一种临时解决方案。

我想提一下,我仍然希望包括 Bing 在内的搜索引擎索引 /search.html,而不是实际在那里搜索。没有“最新搜索”或类似的东西,所以他们从哪里获取查询是一个谜。

编辑#2——我是如何解决
的如果将来其他人有这些问题,我希望这会有所帮助。

首先,事实证明 Bing 具有与 Google 相同的 URL 参数功能。所以我能够告诉 Bing 忽略 URL 参数“q”。

根据正确答案,我在 robots.txt 中添加了参数 q 的不允许行:

Disallow: /*?q=*
Disallow: /*?*q=*

我还在 bing 网站管理员控制台中告诉我们,不要在高峰流量时打扰我们。

总体而言,这立即显示了服务器资源使用情况的积极反馈。但是,我将为相同的查询实施总体泛洪限制,特别是在涉及 _GET 的情况下。因此,万一 Bing 决定访问 AJAX 调用(例如:?action=upvote&postid=1)。

4

1 回答 1

1

垃圾邮件是所有网站所有者都在努力解决的问题。
有很多方法可以建立良好的保护,从非常简单的方法开始,到非常硬和强大的保护机制结束。

但现在对你来说,我看到了一个简单的解决方案。
使用 robots.txt 并禁止 Bing 蜘蛛抓取您的搜索页面。
你可以很容易地做到这一点。

您的robots.txt文件如下所示:

User-agent: bingbot
Disallow: /search.html?q=

但这将完全阻止搜索引擎蜘蛛抓取您的搜索结果。
如果您只想限制此类请求,而不是完全阻止它们,请尝试以下操作:

User-agent: bingbot
crawl-delay: 10

这将强制必应每 10 秒抓取一次您的网站页面。
但是由于这样的延迟,它每天只能抓取 8,640 个页面(每天的请求量非常小)。
如果你对这个很好,那么你就可以了。

但是,如果您想通过服务器本身手动控制这种行为,从而保护搜索表单不仅免受网络爬虫的侵害,而且还免受黑客的侵害,该怎么办?
他们每小时可以轻松地向您的服务器发送超过 50,000 个请求。

在这种情况下,我会向您推荐 2 个解决方案。
首先,将 CloudFlare 连接到您的网站,并且不要忘记通过ViewDNS IP History等服务检查您的服务器真实 IP 是否仍然可用,因为许多具有 CF 保护的网站都缺乏此功能(甚至曾经流行过)。
如果您的活动服务器 IP 在历史记录中可见,那么您可以考虑更改它(强烈推荐)。

其次,您可以使用MemCached存储洪水数据并检测某个 IP 是否查询过多(即 30 q/min)。
如果他们这样做了,请在一段时间内阻止他们使用 perform(通过 MemCached)的机会。

当然,这不是您可以使用的最佳解决方案,但它会起作用并且对您的服务器来说不会花费太多。

于 2017-12-24T21:57:39.303 回答