nginx IF 语句与非字母数字字符匹配

nginx IF 语句与非字母数字字符匹配

我试图通过阻止 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;
}

答案1

感谢@PothiKalimuthu 建议使用 nginx map 指令,效果非常好。

我的最终代码如下:

# user agent blacklist
map $http_user_agent $ua_bots {
    default                                              0;
    ~*(python|wget)                                      1;
    "~*Opera\/9.02 \(Windows XP; U; ru\)"                2;
    "~*Opera\/9.70 \(Linux i686 ; U; en\) Presto\/2.2.1" 3;
}

# block user agents from map blacklist
if ($ua_bots) {
    return 403;
}

答案2

我很高兴您已经将其设置好并运行良好。我希望添加另一种类型的防御,它更专业一些,它将允许现在可能被阻止的用户代理,即使它们不是真正的机器人。另外,我相信您已经阅读了 Nginx 中的 IFISEVIL 部分。:)

我使用 Fail2Ban 通过 ssh 和 http 保护我的网络服务器。你只需为它们创建一个新的 jail,并告诉应用程序监视日志文件,如果一行符合条件,它就可以永久或仅在一段时间内禁止该 IP 地址。

您没有解释您面临哪种类型的机器人攻击,但 Fail2Ban 有很多“现成的”方法来保护网络服务器。甚至有人写了一个名为“坏机器人”的特定部分

[nginx-badbots]
enabled  = true
filter = apache-badbots
action = iptables-multiport[name=BadBots, port="http,https"]
logpath = /var/log/nginx*/*access*.log
bantime = 86400 # 1 day
maxretry = 1

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

相关内容