“Kann ich Bots anhand der IP erkennen?” ist eine der häufigsten Fragen, die uns zur serverseitigen Filterung gestellt werden. Die ehrliche Antwort lautet: Die IP allein ist ein Ausgangspunkt, kein Urteil — aber kombiniert mit ein paar gut gewählten Signalen wird sie zu einem verlässlichen. sgcWebSockets 2026.6 ergänzt die Komponente TsgcWebSocketFirewall um ein neues Modul zur Bot-Erkennung, das genau das tut: Es klassifiziert jede sich verbindende IP anhand von vier unabhängigen Signalen.
Die Bot-Erkennung steht neben den Firewall-Funktionen, die Sie bereits kennen — Blacklist / Whitelist, GeoIP, Brute-Force, Rate Limiting, Bedrohungsbewertung — und folgt demselben Designprinzip über Komponenteneigenschaften. Dieser Beitrag erklärt, wie sie funktioniert und wie Sie sie einrichten.
Vier Signale, eine Klassifizierung
Das Modul wertet jede IP anhand von vier unabhängigen Signalen aus und ermittelt einen einzigen TsgcBotClassification-Wert:
- Bekannte Bot-IP-Bereiche — Abgleich der IP mit veröffentlichten Crawler-Bereichen (Googlebot, Bingbot, GPTBot, ClaudeBot…), die aus einer CIDR-Datei geladen werden. Eine Übereinstimmung bedeutet einen echten, deklarierten Crawler.
- Rechenzentrums- / Hosting-Erkennung — markiert IPs, die zu Bereichen von Cloud- und VPS-Anbietern gehören (AWS, Hetzner, OVH…). Echte Nutzer verbinden sich selten aus Rechenzentrums-ASNs; automatisierter Datenverkehr sehr oft.
- Forward-confirmed reverse DNS (FCrDNS) — führt eine PTR-Abfrage für die IP durch und bestätigt anschließend den ermittelten Hostnamen per Forward-Lookup zurück zur selben IP. Dies ist die einzige verlässliche Methode, einen echten Googlebot von etwas zu unterscheiden, das in einem Header lediglich behauptet, einer zu sein.
- DNSBL-Reputation — fragt DNS-Blocklisten (Spamhaus und andere) nach IPs mit einer bekannten missbräuchlichen Vergangenheit ab.
Das Ergebnis ist einer von sechs Werten:
TsgcBotClassification = (bcUnknown, bcVerifiedCrawler, bcDatacenter,
bcSuspectedBot, bcBlocklisted, bcHuman);
Eine rein IP-basierte Erkennung hat reale Grenzen — Adressen werden hinter CGNAT geteilt, sie wechseln, und ausgefeilte Bots verstecken sich in Pools von Residential Proxies. Daher ist die Bot-Erkennung so konzipiert, dass sie Ihnen eine gute erste Bewertung liefert, keine absolute Wahrheit. Aus diesem Grund blockiert sie konstruktionsbedingt niemals eine Verbindung von sich aus.
Bot-Erkennung aktivieren
Alles befindet sich unter der neuen Eigenschaft BotDetection. Aktivieren Sie die gewünschten Signale und verweisen Sie die dateibasierten auf ihre Daten:
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;
Die beiden dateibasierten Signale nutzen dieselbe schnelle, binär durchsuchte CIDR-Engine, die auch die GeoIP-Datenbank der Firewall antreibt, sodass selbst große Bereichslisten in Mikrosekunden aufgelöst werden.
Reverse DNS und DNSBL blockieren niemals den Accept-Thread
Reverse DNS und DNSBL sind Live-DNS-Abfragen — sie inline im Verbindungsannahme-Thread auszuführen wäre eine selbst verursachte Dienstblockade. Stattdessen löst die Bot-Erkennung sie in einem Hintergrund-Worker-Thread auf und liefert jede Klassifizierung aus einem Cache. Bei einem Cache-Miss wird die IP zur Auflösung in eine Warteschlange gestellt und der aktuelle Aufruf gibt sofort bcUnknown zurück; sobald die Abfrage abgeschlossen ist, wird der Cache aktualisiert und das Ereignis OnBotDetected ausgelöst. Die Eigenschaft CacheDurationSec steuert, wie lange ein Urteil wiederverwendet wird, bevor die IP erneut geprüft wird.
Nur Klassifizierung: OnBotDetected
Die Bot-Erkennung dient nur der Klassifizierung. Sie verweigert niemals von selbst eine Verbindung — sie löst ein Ereignis aus, aktualisiert die Firewall-Statistiken (einen neuen fvBot-Zähler) und überlässt Ihnen die Richtlinienentscheidung. So wird verhindert, dass ein fälschlich klassifizierter verifizierter Crawler stillschweigend verworfen wird.
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;
Sie können jederzeit auch mit GetBotClassification ein Urteil anfordern — praktisch, um eine Antwort anzupassen, statt eine Verbindung zu filtern:
if oFirewall.GetBotClassification(vClientIP) = bcVerifiedCrawler then
// serve a lightweight, cache-friendly variant to the crawler
ServeStaticSnapshot
else
ServeFullApp;
Auf ein Urteil reagieren: die Custom-Rules-Engine
Wenn Sie tatsächlich blockieren möchten, entscheiden Sie sich ausdrücklich dafür über die bestehende Custom-Rules-Engine der Firewall. Jedes TsgcFirewallRuleItem erhält eine neue Eigenschaft BotType: Setzen Sie sie, und die Regel greift bei Verbindungen, deren Klassifizierung diesem Wert entspricht. Sie können diese dann ablehnen, sperren oder protokollieren — und dabei die gesamte Regelmechanik wiederverwenden, die Sie bereits haben.
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;
Diese Trennung — passive Klassifizierung im Bot-Erkennungsmodul, aktive Durchsetzung nur über eine von Ihnen geschriebene Regel — bedeutet, dass die Funktion Sie niemals überraschen kann, indem sie Datenverkehr blockiert, den Sie behalten wollten.
Eigenes Urteil mitbringen: OnResolveBot
Wenn Sie bereits einen Threat-Intelligence-Dienst, einen internen Reputations-Cache oder einen kommerziellen Bot-Mitigation-Feed betreiben, weisen Sie das Ereignis OnResolveBot zu. Ist es gesetzt, liefert Ihr Handler das Urteil und der eingebaute Resolver tritt zurück — dasselbe Override-Muster, das die Firewall bereits für OnResolveCountry von GeoIP verwendet.
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
Die Firewall-Demo in Demos\04.WebSocket_Other_Samples\13.Firewall hat einen neuen Tab Bot Detection, auf dem Sie jedes Signal einzeln einschalten, die Dateien mit bekannten Bots und Rechenzentrumsbereichen laden, DNSBL-Zonen konfigurieren und mit einem Live-“Classify IP”-Tester das Urteil für jede beliebige Adresse sehen können — wobei jede Klassifizierung im Ereignisprotokoll mitläuft.
Verfügbarkeit
Die Bot-Erkennung ist in sgcWebSockets 2026.6 enthalten und eine nahtlose Ergänzung: Die Eigenschaft BotDetection ist standardmäßig deaktiviert, sodass bestehende Projekte unberührt bleiben, bis Sie sie einschalten. Die Funktion ist für Delphi (7 bis 13), C++Builder und die .NET-Edition verfügbar.
Kunden mit einem aktiven Abonnement können den neuen Build im Kundenbereich herunterladen. Testnutzer können den aktualisierten Installer unter esegece.com/products/websockets/download beziehen.
Fragen, Feedback oder Hilfe bei der Migration? Kontaktieren Sie uns — Sie erhalten eine Antwort von den Menschen, die den Code geschrieben haben.
