Jak zablokować MJ12bot?

Jeśli twoja strona padła ofiarą ataku DoS bota firmy Majestic, konkretnie MJ12bot, tak jak moja, to kilka porad jak zablokować to dziadostwo.

Majestic MJ12bot

Jakiś czas temu zauważyłem wzmożony ruch na stronach spowodowany masowym skanowanie stron przez bota:

192.99.37.132 - - [03/Nov/2022:01:19:14 +0100] "GET / HTTP/1.1" 200 7266 "-" "Mozilla/5.0 (compatible; MJ12bot/v1.4.8; http://mj12bot.com/)"

Requesty leciały jeden za drugim na wszystkie moje strony z dziesiątkami parametrów, dzień i noc w kółko wałkował każdą możliwą podstronę.

Co to jest MJ12bot?

To bot crawlujący narzędzia Majestic SEO (nie polecam). Bot jest nieudolnie napisany i nie tylko ja mam z nim problemy, ponieważ dostaje pierdolca i DoS-uje strony poprzez masowe skanowanie nawet najgłupszych URL-i.

Warto pamiętać, że niektóre boty podszywają się pod MJ12bot, ale to dodatkowy powód, żeby i je blokować.

Jak teoretycznie zablokować MJ12bot?

Oficjalnie przez regułę blokującą w robots.txt, wystarczy dopisać te dwie linjki:

User-agent: MJ12bot
Disallow: /

Ale moment, moment! Kto by się tym przejmował, na pewno nie taka firma, która żyje z harvestowania danych SEO i dodanie tego wpisu do robots.txt nie ma kompletnie wpływu na to jak działa ich bot!

Jak skutecznie zablokować MJ12bot?

Zarówno tego dziadowskiego bota, jak i inne crawlery, które nie mają wpływu na indeksację naszej strony można prosto zablokować na poziomie serwera HTTP. W moim przypadku jest to nginx.

Wystarczy dodać regułę do sekcji server { … } (nie można tego niestety dodać do głównego bloku http { … } i dla każdej strony trzeba to kopiować):

if ($http_user_agent ~* "(SemrushBot|Semrush|AhrefsBot|MJ12bot|MegaIndex.ru|BLEXbot|BLEXBot|ZoominfoBot|YaK|VelenPublicWebCrawler|SentiBot|Vagabondo|SEOkicks|SEOkicks-Robot|mtbot|DotBot|Cliqzbot|coccocbot|Scrap|SiteCheck-sitecrawl|MauiBot|Java|GumGum|Clickagy|AspiegelBot|TkBot|CCBot|Qwantify|MBCrawler|serpstatbot|AwarioSmartBot|Semantici|ScholarBot|proximic|MojeekBot|GrapeshotCrawler|IAScrawler|linkdexbot|contxbot|PlurkBot|PaperLiBot|BomboraBot|Leikibot|weborama-fetcher|NTENTbot|admantx-usaspb|Eyeotabot|VoluumDSP-content-bot|SirdataBot|adbeat_bot|TTD-Content|admantx|Nimbostratus-Bot|Mail.RU_Bot|Quantcastboti|Onespot-ScraperBot|Taboolabot|Baidu|Jobboerse|VoilaBot|Sogou|Jyxobot|Exabot|ZGrab|Proximi|Sosospider|Accoona|aiHitBot|Genieo|BecomeBot|ConveraCrawler|NerdyBot|OutclicksBot|findlinks|JikeSpider|Gigabot|CatchBot|Huaweisymantecspider|Offline Explorer|SiteSnagger|TeleportPro|WebCopier|WebReaper|WebStripper|WebZIP|Xaldon_WebSpider|BackDoorBot|AITCSRoboti|Arachnophilia|BackRub|BlowFishi|perl|CherryPicker|CyberSpyder|EmailCollector|Foobot|GetURL|httplib|HTTrack|LinkScan|Openbot|Snooper|SuperBot|URLSpiderPro|MAZBot|EchoboxBot|SerendeputyBot|LivelapBot|linkfluence|TweetmemeBot|LinkisBot|CrowdTanglebot|Netcraft)") { return 403; }

Można tą regułę zapisać np. w pliku block-bots.conf i załączyć ten plik jeśli chcemy blokować boty na wielu stronach (zamiast przeklejać w kółko to samo):

server {
# block SEO bots
include /etc/nginx/global/block-bots.conf;

I przeładować nginx-a komendą:

service nginx reload

I po sprawie. Kiedyś myślałem, że fajnie, że boty SEO odwiedzają moją stronę, jednak teraz widzę, że ja nie mam z tego kompletnie korzyści, a jak trafi się tak nieudolnie napisany bot jak ten MJ12bot to może jeszcze namieszać. Blokować dziada!

PS. Zaktualizowałem listę botów, usunąłem blokady na Senzam, Python i Yandexa. Dodałem blokadę na bota Netcraft.

5 komentarzy do “Jak zablokować MJ12bot?”

    • Faktycznie, zawsze można usunąć co tam się chce panie majster, ale boty stricte SEO nie wnoszą niczego pożytecznego oprócz zjadania bandwidthu, a ten MJ12bot to już chamstwo level hard, jak spojrzałem w logi co on mi harvestuje to się złapałem za głowę. Za samo ignorowanie reguł robots.txt należy mu się kop w dupę 🙂

      Odpowiedz
  1. Używanie if w konfiguracjach nginx, zwłaszcza z dużymi wyrażeniami regularnymi, może być nieco nieefektywne, zwłaszcza dla stron o dużym ruchu.

    Jeśli chcemy zablokować boty, najlepszą praktyką będzie użycie modułu map, a następnie użycie dyrektywy if z jednym dopasowaniem, aby zwrócić 403 Forbidden. Dzięki temu konfiguracja jest bardziej przejrzysta i łatwiejsza do zarządzania.

    Oto, jak można to skonfigurować:

    Blok map pozwala mapować jeden zestaw wartości na inny zestaw wartości. W tym przypadku mapujemy konkretne ciągi User-Agent na wartość blokowania = 1). Dodajemy blok map w kontekście http a warunek if w kontekscie server, operator ~* – jest case-insensitive:

    http {
    map $http_user_agent $block_bots {
    default 0;
    ~*MJ12bot 1;
    ~*SeekportBot 1;
    ~*AhrefsBot 1;
    ~*SemrushBot 1;
    ~*DotBot 1;
    ~*Barkrowler 1;
    ~*DataForSeoBot 1;
    }
    }

    server {
    if ($block_bots) {
    return 403;
    }
    }

    Odpowiedz

Dodaj komentarz