sgcWebSockets 2026.6 — Bot-Erkennung in der Firewall

· Komponenten

“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:

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.