sgcWebSockets 2026.6 — Botdetectie in de Firewall

· Componenten

“Kan ik bots identificeren aan de hand van het IP?” is een van de meest gestelde vragen die we krijgen over filtering aan de serverzijde. Het eerlijke antwoord is: het IP alleen is een startpunt, geen oordeel — maar gecombineerd met enkele goed gekozen signalen wordt het een betrouwbaar oordeel. sgcWebSockets 2026.6 voegt een nieuwe Botdetectie-module toe aan de TsgcWebSocketFirewall-component die precies dat doet, door elk verbindend IP te classificeren met behulp van vier onafhankelijke signalen.

Botdetectie staat naast de firewallfuncties die u al kent — blacklist / whitelist, GeoIP, brute-force, rate limiting, threat scoring — en volgt hetzelfde op componenteigenschappen gebaseerde ontwerp. Dit bericht beschrijft hoe het werkt en hoe u het instelt.

Vier signalen, één classificatie

De module evalueert elk IP aan de hand van vier onafhankelijke signalen en bepaalt één TsgcBotClassification-waarde:

Het resultaat is een van zes waarden:

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

Detectie uitsluitend op basis van IP heeft echte beperkingen — adressen worden gedeeld achter CGNAT, ze rouleren, en geavanceerde bots verbergen zich binnen residentiële proxypools. Daarom is Botdetectie gebouwd om u een goede eerste score te geven, geen absolute waarheid. Daarom blokkeert het, vanuit het ontwerp, nooit een verbinding op eigen houtje.

Botdetectie inschakelen

Alles bevindt zich onder de nieuwe BotDetection-eigenschap. Schakel de signalen in die u wenst en wijs de bestandsgebaseerde signalen naar hun gegevens:

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;

De twee bestandsgebaseerde signalen hergebruiken dezelfde snelle, binair doorzochte CIDR-engine die de GeoIP-database van de firewall aandrijft, zodat zelfs grote bereiklijsten in microseconden worden opgelost.

Reverse DNS en DNSBL blokkeren nooit de accept-thread

Reverse DNS en DNSBL zijn live DNS-bevragingen — deze inline uitvoeren op de connection-accept-thread zou een zelfopgelegde denial of service zijn. In plaats daarvan lost Botdetectie ze op op een achtergrond-workerthread en levert elke classificatie uit een cache. Bij een cache miss wordt het IP in de wachtrij geplaatst voor resolutie en geeft de huidige aanroep onmiddellijk bcUnknown terug; wanneer de opzoeking klaar is, wordt de cache bijgewerkt en wordt het OnBotDetected-event geactiveerd. De CacheDurationSec-eigenschap bepaalt hoe lang een oordeel wordt hergebruikt voordat het IP opnieuw wordt gecontroleerd.

Alleen classificeren: OnBotDetected

Botdetectie is alleen-classificeren. Het weigert nooit zelf een verbinding — het activeert een event, werkt de firewallstatistieken bij (een nieuwe fvBot-teller) en laat de beleidsbeslissing aan u over. Dat voorkomt dat een verkeerd geclassificeerde geverifieerde crawler stilzwijgend wordt verworpen.

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;

U kunt op elk moment ook om een oordeel vragen met GetBotClassification — handig om een reactie op maat te maken in plaats van een verbinding te filteren:

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

Handelen op een oordeel: de Custom Rules-engine

Wanneer u wel wilt blokkeren, kiest u daar expliciet voor via de bestaande Custom Rules-engine van de firewall. Elke TsgcFirewallRuleItem krijgt een nieuwe BotType-eigenschap: stel deze in, en de regel komt overeen met verbindingen waarvan de classificatie gelijk is aan die waarde. U kunt ze vervolgens weigeren, verbannen of loggen — waarbij u alle regelmachinerie hergebruikt die u al hebt.

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;

Deze scheiding — passieve classificatie in de Botdetectie-module, actieve handhaving alleen via een regel die u schrijft — betekent dat de functie u nooit kan verrassen door verkeer te blokkeren dat u wilde behouden.

Lever uw eigen oordeel: OnResolveBot

Als u al een threat-intelligence-dienst, een interne reputatiecache of een commerciële bot-mitigatiefeed gebruikt, wijs dan het OnResolveBot-event toe. Wanneer het is ingesteld, levert uw handler het oordeel en stappen de ingebouwde resolverstappen opzij — hetzelfde overschrijfpatroon dat de firewall al gebruikt voor de OnResolveCountry van 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

De Firewall-demo in Demos\04.WebSocket_Other_Samples\13.Firewall heeft een nieuw tabblad Bot Detection waar u elk signaal kunt inschakelen, de bekende-bot- en datacenterbereikbestanden kunt laden, DNSBL-zones kunt configureren en een live “Classify IP”-tester kunt gebruiken om het oordeel voor elk adres te zien — waarbij elke classificatie naar het event-logboek wordt gestreamd.

Beschikbaarheid

Botdetectie wordt geleverd in sgcWebSockets 2026.6 en is een drop-in-toevoeging: de BotDetection-eigenschap staat standaard uitgeschakeld, zodat bestaande projecten onaangetast blijven totdat u het inschakelt. De functie is beschikbaar voor Delphi (7 tot en met 13), C++Builder en de .NET-editie.

Klanten met een actief abonnement kunnen de nieuwe build downloaden uit het klantengedeelte. Proefgebruikers kunnen het bijgewerkte installatieprogramma ophalen op esegece.com/products/websockets/download.

Vragen, feedback of hulp bij migratie? Neem contact op — u krijgt een antwoord van de mensen die de code hebben geschreven.