我试图通过阻止 nginx 中的用户代理来阻止一些讨厌的机器人。当多个用户代理/匹配项具有非字母数字字符并且需要用引号括起来时,将多个用户代理/匹配项放在同一个 if 语句中的最佳方法是什么。
这有效:
if ($http_user_agent ~* (python|wget)) {
return 403;
}
if ($http_user_agent ~* "Opera/9.02 (Windows XP; U; ru)") {
return 403;
}
if ($http_user_agent ~* "Opera/9.70 (Linux i686 ; U; en) Presto/2.2.1") {
return 403;
}
但我更喜欢这样的东西(不是这种格式):
if ($http_user_agent ~* (python|wget|"Opera/9.02 (Windows XP; U; ru)"|"Opera/9.70 (Linux i686 ; U; en) Presto/2.2.1") ) {
return 403;
}
感谢@PothiKalimuthu,他建议使用 nginx map 指令,效果很好。
我的最终代码如下所示:
我很高兴你把它弄得很好。我希望添加另一种类型的防御,它会更专业一些,它将允许现在可能被阻止的用户代理,即使他们不是真正的机器人。另外,我确定您已经阅读了 Nginx 的 te IFISEVIL 部分。:)
我正在使用 Fail2Ban 通过 ssh 和 http 保护我的网络服务器。您只需要为他们创建一个新监狱,并告诉应用程序查看日志文件,如果一行符合标准,它可以永久或仅在一段时间内禁止 IP 地址。
您没有解释机器人会针对哪种类型的攻击,但是 Fail2Ban 有很多“开箱即用”的方法来保护网络服务器。甚至有人写了一个特定的部分,叫做:Bad bots
https://snippets.aktagon.com/snippets/554-how-to-secure-an-nginx-server-with-fail2ban
https://www.google.hu/search?q=fail2ban+nginx&oq=fail2ban+nginx&aqs=chrome..69i57.2063j0j4&sourceid=chrome&ie=UTF-8