The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



"Раздел полезных советов: Борьба с web-ботами через запрет HTTP/1.1"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Изначальное сообщение [ Отслеживать ]

"Раздел полезных советов: Борьба с web-ботами через запрет HTTP/1.1"  +/
Сообщение от auto_tips (??), 09-Мрт-26, 19:01 
Как один из вариантов борьбы с AI-скрапперами, создающими огромную паразитную нагрузку на сервер, [[https://sheep.horse/2026/3/blocking_http1.1_-_some_results.html предложено]] ограничить доступ к сайту по протоколу HTTP/2 и полностью отключить поддержку HTTP/1.0 и HTTP/1.1. Логика подобного решения в том, что все современные браузеры поддерживают HTTP/2, а боты почти всегда обращаются к сайтам по HTTP/1.1 и пока не пытаются использовать HTTP/2 в случае невозможности отправить запрос на HTTP/1.1.

При этом важно учесть, что RSS-ридеры и полезные поисковые боты, такие как Google Bot, также ограничены использованием HTTP/1.1 и для них необходимо сделать исключение.

Пример правил для http-сервера Caddy, возвращающих клиенту ошибку при обращении по HTTP/1:

   @http-too-old {
       not protocol http/2+
       not path /rss.xml /atom.xml # allow rss
       # Белый список для поисковых ботов и старых браузеров
      not header_regexp User-Agent (?i)(Google-Site-Verification|googlebot|bingbot|duckduckbot|mastodon|^Lynx)
   }

   example.com {
       ....
       handle @http-too-old {
          respond 418
       }
   }


Пример для nginx:

   http {
      ...
      map $server_protocol $is_http2 {
          default 0;
          "HTTP/2.0" 1;
          "HTTP/3.0" 1;
      }

      map $request_uri $is_rss {
          default 0;
          ~^/(rss\.xml|atom\.xml)$ 1;
      }

      map $http_user_agent $is_bot {
          default 0;
          ~*Google-Site-Verification 1;
          ~*googlebot 1;
          ~*bingbot 1;
          ~*duckduckbot 1;
          ~*mastodon 1;
          ~*^Lynx 1;
      }
   }
   server {
      ...
      if ($is_http2 = 0) {
         if ($is_rss = 0) {
            if ($is_bot = 0) {
                return 418;
            }
         }
      }
   }

URL: https://sheep.horse/2026/3/blocking_http1.1_-_some_results.html
Обсуждается: http://www.opennet.dev/tips/info/3295.shtml

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения [Сортировка по времени | RSS]


1. "Борьба с web-ботами через запрет HTTP/1.1"  +1 +/
Сообщение от Аноним (1), 09-Мрт-26, 19:01 
Так себе идея, не учитывающая много исключений.
Мы сделали чуть сложнее - проанализировали набор заголовков, используемых провайдеров, подсети и собрали набор маркеров. При поступлении запроса он (с помощью кода на lua в nginx) анализируется, при совпадении любого из маркеров ему начисляются очки. Например если Firefox шлет Chrome-специфичный заголовок, используется китайская локаль (90% скрейперов нападающих на наш хостинг имеют китайскую локаль), поведение не соответствует версии браузера, меченая ASN и т.д. Набрал больше первого порога - страницу отдаем, но с минимальной скоростью (в планах челлендж, но это потом). Набрал выше второго порога - давай до свидания! (с)
В среднем 27-35% трафика летит в 444, еще 8-10 отдается с задержкой. И с момента внедрения нагрузка на ноды бэкендов ни разу не превысила штатную.
Ответить | Правка | Наверх | Cообщить модератору

2. "Борьба с web-ботами через запрет HTTP/1.1"  +1 +/
Сообщение от Гость (??), 09-Мрт-26, 20:58 
С ботами из сети Tencent как? оттуда валится столько запросов и входящего трафика, что лучше из банить до http сервера.
Ответить | Правка | Наверх | Cообщить модератору

4. "Борьба с web-ботами через запрет HTTP/1.1"  +/
Сообщение от Аноним (1), 10-Мрт-26, 06:52 
С ними проще - можно банить прям подсетями. Брать из BGP списки подсетей принадлежащие AS Tencent, Alibaba, Huawei cloud и пр. и закидывать пачками в ipset/netfilter. Простенький скрипт в кроне раз в неделю
Ответить | Правка | Наверх | Cообщить модератору

3. "Борьба с web-ботами через запрет HTTP/1.1"  +/
Сообщение от S_Paulemail (??), 09-Мрт-26, 21:55 
Вложенные "if"'ы наверное можно map'ами сделать.

map $is_http2:$is_rss:$is_bot $isdrop {
  default 0
  "0:0:0" 1;
}

server {
...
  if ($isdrop = 1) { return 418; }
...
}

Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2026 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру