“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:
- Znane zakresy IP botów — dopasowuje adres IP do opublikowanych zakresów robotów (Googlebot, Bingbot, GPTBot, ClaudeBot…) wczytanych z pliku CIDR. Dopasowanie oznacza prawdziwego, zadeklarowanego robota.
- Wykrywanie centrów danych / hostingu — oznacza adresy IP należące do zakresów dostawców chmury i VPS (AWS, Hetzner, OVH…). Prawdziwi użytkownicy rzadko łączą się z adresów ASN centrów danych; ruch automatyczny robi to bardzo często.
- Potwierdzony zwrotny DNS (FCrDNS) — wykonaj zapytanie PTR dla adresu IP, a następnie potwierdź wynikową nazwę hosta z powrotem na ten sam adres IP. To jedyny wiarygodny sposób, aby odróżnić prawdziwego Googlebota od czegokolwiek, co jedynie twierdzi w nagłówku, że nim jest.
- Reputacja DNSBL — odpytuje listy blokad DNS (Spamhaus i inne) w poszukiwaniu adresów IP o znanej, nadużywającej historii.
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.
