nginx 阻止 curl 和 wget

nginx 阻止 curl 和 wget

我有 nginx 网络服务器。
我有一个内容丰富的网站,我发现一些恶意机器人正在试图抓取我的内容。我阻止了任何进入我网站的 curl 或 wget,如下所示

如果 ($http_user_agent ~* (curl|wget)) { 返回 301 $scheme://www.google.com/; }

但我发现如果我改变了- 用户代理在如下的 curl 请求中

curl --user-agent "Googlebot/2.​​1 (+http://www.google.com/bot.html)" http://example.com/mypage.php
或者
curl --user-agent“无论什么” http://example.com/mypage.php

知道如何阻止使用 curl 或 wget 生成的任何请求吗?Nginx无论发送了什么虚假用户代理

答案1

用户代理

User-Agent 总是可以被欺骗。你可以检查其他标头,但更聪明的机器人也会欺骗这些标头。 例如,Accept、Accept-Language、Connection 以及其他一些不总是按对象类型使用的

饼干

智能程度较低的机器人不会正确接受和发送 Cookie,因此您可以使用 Cookie 保护某些资源。这可能会影响隐私,您应该考虑这一点。

JavaScript

有些机器人无法处理 JavaScript。您可以设置一个隐藏的 JavaScript“谜题”,即要求浏览器计算一个简单的随机数学问题的答案。除非您找到一种巧妙的方法来排除它们,否则这会破坏许多 API Restful 客户端。

验证

如果您想要让机器人远离您的资源,那么您将需要使用身份验证来保护这些资源。

活着

如果您确定访问您网站的每个人都支持保持活动状态;包括代理,那么您可以阻止不支持该功能的连接。有些人会发现此选项不合常规。

模糊的选项也可能限制浏览器和/或 API 客户端

我还发现有些机器人无法处理 TLS1.2+SNI,因为它们通常使用不支持 TLS1.2 甚至更不常见的 SNI 的旧库。如果相关的话,这会限制用户访问您网站上的 API 的能力。

我将留给您研究如何测试和实施其中的每一项,以及其中哪些可能合适或可能不合适。一刀切并不适合所有人。

答案2

被盗堆栈溢出,您可以在您的网站中放置一个无法通过链接访问的 URL,但当爬虫看到它时,它会尝试爬取此地址。这样您就可以阻止该爬虫。

<a style="display:none" href="./dontgohere.php">A</a>

列出你的 IP 后,你可以使用ngx_http_access_module阻止地址,甚至使用 fail2ban。您可以采取几种不同的解决方案。

但是,如果您严格阻止用户代理字符串,那么正如亚历山大所说,这是不可能的。

答案3

这是不可能的。curl并且wget可以放置任何用户代理,并且不可能知道谁在抓取您的网站。

相关内容