Назад | Перейти на главную страницу

Оператор 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;
}

Я рада, что вы все сделали хорошо. Я хочу добавить еще один тип защиты, который будет несколько более профессиональным и позволит пользовательским агентам, которые, скорее всего, будут заблокированы сейчас, даже если они на самом деле не являются ботами. Кроме того, я уверен, что вы читали часть IFISEVIL от Nginx. :)

Я использую Fail2Ban для защиты своих веб-серверов через ssh и http. Вам просто нужно создать для них новую тюрьму и указать приложению, чтобы оно просматривало файлы журнала, и если одна строка соответствует критериям, оно может заблокировать 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

Спасибо @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;
}