sgcWebSockets 2026.6 — Wykrywanie botów w zaporze

· Komponenty

“Czy mogę zidentyfikować boty po adresie IP?” to jedno z najczęstszych pytań, jakie otrzymujemy na temat filtrowania po stronie serwera. Szczera odpowiedź brzmi: sam adres IP to punkt wyjścia, a nie werdykt — ale w połączeniu z kilkoma dobrze dobranymi sygnałami staje się on wiarygodny. sgcWebSockets 2026.6 dodaje nowy moduł Wykrywania botów do komponentu TsgcWebSocketFirewall, który robi dokładnie to, klasyfikując każdy łączący się adres IP przy użyciu czterech niezależnych sygnałów.

Wykrywanie botów stoi obok funkcji zapory, które już znasz — czarna lista / biała lista, GeoIP, ochrona przed atakami siłowymi, ograniczanie szybkości, ocena zagrożeń — i stosuje ten sam projekt oparty na właściwościach komponentu. Ten wpis pokazuje, jak to działa i jak to skonfigurować.

Cztery sygnały, jedna klasyfikacja

Moduł ocenia każdy adres IP względem czterech niezależnych sygnałów i ustala pojedynczą wartość TsgcBotClassification:

Wynikiem jest jedna z sześciu wartości:

TsgcBotClassification = (bcUnknown, bcVerifiedCrawler, bcDatacenter,
  bcSuspectedBot, bcBlocklisted, bcHuman);

Wykrywanie wyłącznie na podstawie adresu IP ma realne ograniczenia — adresy są współdzielone za CGNAT, są rotowane, a wyrafinowane boty ukrywają się w pulach domowych serwerów proxy. Dlatego Wykrywanie botów zostało zaprojektowane tak, aby dawać dobrą ocenę przy pierwszym przejściu, a nie absolutną prawdę. Z tego powodu z założenia nigdy nie blokuje połączenia samodzielnie.

Włączanie Wykrywania botów

Wszystko znajduje się w nowej właściwości BotDetection. Włącz potrzebne sygnały i wskaż tym opartym na plikach ich dane:

uses
  sgcWebSocket_Server_Firewall;

var
  oFirewall: TsgcWebSocketFirewall;
begin
  oFirewall := TsgcWebSocketFirewall.Create(nil);

  oFirewall.BotDetection.Enabled := True;

  // 1. Verified crawler IP ranges  (file lines: CIDR,botname)
  oFirewall.BotDetection.KnownBotsFile := 'C:\firewall\known-bots.csv';

  // 2. Datacenter / hosting ranges  (file lines: CIDR,asn-name)
  oFirewall.BotDetection.Datacenter.Enabled := True;
  oFirewall.BotDetection.Datacenter.ASNFile := 'C:\firewall\datacenter-ranges.csv';

  // 3. Forward-confirmed reverse DNS verification
  oFirewall.BotDetection.ReverseDNS.Enabled := True;

  // 4. DNSBL reputation lookups
  oFirewall.BotDetection.DNSBL.Enabled := True;
  oFirewall.BotDetection.DNSBL.Zones.Add('zen.spamhaus.org');

  // Resolution tuning
  oFirewall.BotDetection.CacheDurationSec := 3600;   // cache a verdict for 1h
  oFirewall.BotDetection.DNSTimeoutMS     := 2000;

  oServer.Firewall := oFirewall;
end;

Dwa sygnały oparte na plikach ponownie wykorzystują ten sam szybki silnik CIDR z wyszukiwaniem binarnym, który zasila bazę danych GeoIP zapory, więc nawet duże listy zakresów są przetwarzane w mikrosekundach.

Zwrotny DNS i DNSBL nigdy nie blokują wątku akceptującego

Zwrotny DNS i DNSBL to bieżące zapytania DNS — uruchamianie ich w trybie wbudowanym na wątku akceptującym połączenie byłoby samonarzuconą odmową usługi. Zamiast tego Wykrywanie botów rozwiązuje je na wątku roboczym działającym w tle i obsługuje każdą klasyfikację z pamięci podręcznej. W przypadku braku trafienia w pamięci podręcznej adres IP zostaje umieszczony w kolejce do rozwiązania, a bieżące wywołanie natychmiast zwraca bcUnknown; gdy zapytanie się zakończy, pamięć podręczna jest aktualizowana i uruchamiane jest zdarzenie OnBotDetected. Właściwość CacheDurationSec kontroluje, jak długo werdykt jest ponownie wykorzystywany, zanim adres IP zostanie ponownie sprawdzony.

Tylko klasyfikacja: OnBotDetected

Wykrywanie botów służy wyłącznie do klasyfikacji. Nigdy samodzielnie nie odmawia połączenia — uruchamia zdarzenie, aktualizuje statystyki zapory (nowy licznik fvBot) i pozostawia decyzję o zasadach tobie. Dzięki temu błędnie sklasyfikowany zweryfikowany robot nie zostanie po cichu odrzucony.

procedure TForm1.FirewallBotDetected(Sender: TObject; const aIP: string;
  aClassification: TsgcBotClassification; const aBotName: string);
begin
  case aClassification of
    bcVerifiedCrawler:
      DoLog(aIP + ' is a verified crawler: ' + aBotName);
    bcDatacenter:
      DoLog(aIP + ' originates from a datacenter / hosting range');
    bcBlocklisted:
      DoLog(aIP + ' is listed on a DNSBL');
  end;
end;

Możesz również poprosić o werdykt w dowolnym momencie za pomocą GetBotClassification — przydatne do dostosowania odpowiedzi zamiast filtrowania połączenia:

if oFirewall.GetBotClassification(vClientIP) = bcVerifiedCrawler then
  // serve a lightweight, cache-friendly variant to the crawler
  ServeStaticSnapshot
else
  ServeFullApp;

Reagowanie na werdykt: silnik reguł niestandardowych

Gdy chcesz zablokować, decydujesz się na to jawnie poprzez istniejący silnik reguł niestandardowych zapory. Każdy element TsgcFirewallRuleItem zyskuje nową właściwość BotType: ustaw ją, a reguła dopasuje połączenia, których klasyfikacja jest równa tej wartości. Następnie możesz je odrzucić, zbanować lub zarejestrować — ponownie wykorzystując cały mechanizm reguł, który już masz.

var
  oRule: TsgcFirewallRuleItem;
begin
  oFirewall.CustomRules.Enabled := True;

  // Ban any IP listed on a DNSBL for one hour
  oRule := oFirewall.CustomRules.Rules.Add as TsgcFirewallRuleItem;
  oRule.Name           := 'ban-blocklisted-bots';
  oRule.BotType        := bcBlocklisted;
  oRule.ActionType     := raBan;
  oRule.BanDurationSec := 3600;
end;

Ten podział — pasywna klasyfikacja w module Wykrywania botów, aktywne egzekwowanie wyłącznie poprzez napisaną przez ciebie regułę — oznacza, że ta funkcja nigdy nie zaskoczy cię zablokowaniem ruchu, który chciałeś zachować.

Przynieś własny werdykt: OnResolveBot

Jeśli już korzystasz z usługi analizy zagrożeń, wewnętrznej pamięci podręcznej reputacji lub komercyjnego źródła łagodzenia botów, przypisz zdarzenie OnResolveBot. Gdy jest ustawione, twoja procedura obsługi dostarcza werdykt, a wbudowane kroki resolwera ustępują — ten sam wzorzec nadpisywania, którego zapora już używa dla zdarzenia OnResolveCountry w GeoIP.

procedure TForm1.FirewallResolveBot(Sender: TObject; const aIP: string;
  var aClassification: TsgcBotClassification; var aBotName: string);
begin
  // Consult your own threat feed instead of the built-in resolver
  if MyThreatFeed.IsMaliciousBot(aIP) then
  begin
    aClassification := bcBlocklisted;
    aBotName        := 'internal-threat-feed';
  end;
end;

Demo

Demo zapory w Demos\04.WebSocket_Other_Samples\13.Firewall ma nową kartę Wykrywanie botów, na której możesz włączać poszczególne sygnały, wczytywać pliki znanych botów i zakresów centrów danych, konfigurować strefy DNSBL oraz używać działającego na żywo testera “Klasyfikuj IP”, aby zobaczyć werdykt dla dowolnego adresu — z każdą klasyfikacją przesyłaną do dziennika zdarzeń.

Dostępność

Wykrywanie botów jest dostarczane w sgcWebSockets 2026.6 i stanowi dodatek typu drop-in: właściwość BotDetection domyślnie jest wyłączona, więc istniejące projekty pozostają nienaruszone, dopóki jej nie włączysz. Funkcja jest dostępna dla Delphi (od 7 do 13), C++Builder oraz edycji .NET.

Klienci z aktywną subskrypcją mogą pobrać nową kompilację z obszaru klienta. Użytkownicy wersji próbnej mogą pobrać zaktualizowany instalator pod adresem esegece.com/products/websockets/download.

Pytania, opinie lub pomoc w migracji? Skontaktuj się z nami — otrzymasz odpowiedź od osób, które napisały ten kod.