Firewall voor sgcWebSockets-servers

· Componenten

Beveiliging is niet langer optioneel. Elke WebSocket-server die aan het internet wordt blootgesteld, is een doelwit voor brute-force-aanvallen, injectiepogingen, connection-flooding en geautomatiseerd misbruik. Verdedigen tegen deze bedreigingen vereist meestal het bolt-on van externe middleware, het schrijven van aangepaste filterlogica of het uitrollen van een aparte reverse proxy — allemaal zaken die complexiteit toevoegen en de ontwikkeling vertragen.

sgcWebSockets 2026.4.0 introduceert TsgcWSFirewall — een speciaal firewall-component dat direct in je WebSocket-server wordt geplugd, nu met 15 beschermingsmodules waaronder GeoIP-landfiltering, adaptieve threat-scoring, progressieve ban-escalatie en een custom-rules-engine. Plaats het component, configureer de beschermingsmodules die je nodig hebt, koppel het aan de server en je toepassing is beschermd. Geen externe afhankelijkheden. Geen middleware. Geen custom-code voor de gangbare gevallen.

Dit artikel behandelt de volledige featureset en laat zien hoe je elke beschermingsmodule in Delphi configureert.

Vijftien beschermingsmodules, één component

De firewall biedt vijftien onafhankelijke beschermingsmodules. Schakel alleen in wat je nodig hebt — elke module werkt op zichzelf of in combinatie met de andere.

IP-blacklist
Blokkeer specifieke IP-adressen of hele ranges met CIDR-notatie. Verbindingen vanaf blacklisted-IP's worden geweigerd voordat ze je toepassingscode bereiken.
IP-whitelist
Definieer een lijst met vertrouwde IP's. Wanneer ingeschakeld omzeilen whitelisted-adressen alle andere beveiligingscontroles — ideaal voor interne diensten en monitoringtools.
Brute-force-bescherming
Houd mislukte authenticatiepogingen per IP bij. Verban overtreders automatisch na een instelbare drempel binnen een schuivend tijdvenster.
SQL-injection-detectie
Scan inkomende berichten op gangbare SQL-injection-patronen. Ingebouwde detectie voor boolean-injection, UNION SELECT, statement-injection en meer.
XSS-detectie
Detecteer cross-site-scripting-payloads in berichten. Vangt script-tags, event-handlers, JavaScript-protocol-URI's, iframe-injectie en CSS-expressies op.
Connection-rate-limiting
Beperk het aantal gelijktijdige verbindingen per IP-adres. Voorkomt dat één client serverresources opslokt.
Message-flood-bescherming
Throttle het aantal berichten dat één IP per seconde kan versturen. Beschermt tegen message-flooding en denial-of-service-patronen.
Payload-size-limiting
Wijs berichten af die een maximale grootte overschrijden. Voorkomt geheugenuitputting door te grote payloads.
Path-traversal-detectie
Detecteer directory-traversal-sequenties in berichten. Blokkeert pogingen om bestanden buiten de bedoelde scope te benaderen.
Command-injection-detectie
Detecteer OS-command-injection-patronen in berichten. Blokkeert shell-metakarakters en gangbare commando-sequenties.
GeoIP-landfiltering
Sta verbindingen toe of blokkeer ze op basis van geografische herkomst. Ondersteunt blocklist- en allowlist-modi met CSV-database-lookup.
Threat-score-systeem
Verzamel gewogen scores per IP over alle overtredingstypen. Auto-ban wanneer een drempel wordt bereikt, met automatische decay over tijd.
Progressieve ban-escalatie
Verleng de banduur bij elke herhaalde overtreding. Escaleer van korte bans naar permanente blokkades voor volhardende overtreders.
WebSocket-bescherming
Valideer WebSocket-origins, dwing frame-grootte-limieten af en filter subprotocollen. Bescherming op protocolniveau buiten de berichtinhoud om.
Custom-rules-engine
Definieer je eigen firewall-regels met condities en acties. Maak overtredingsdrempels, tijdvensters en geautomatiseerde reacties aan.

Snelstart

De firewall werkend krijgen vraagt slechts drie stappen: aanmaken, configureren en koppelen.

var
  oFirewall: TsgcWSFirewall;
  oServer: TsgcWebSocketHTTPServer;
begin
  oFirewall := TsgcWSFirewall.Create(nil);
  oFirewall.Enabled := True;
  // Enable the modules you need
  oFirewall.Blacklist.Enabled := True;
  oFirewall.Blacklist.IPs.Add('10.0.0.0/8');
  oFirewall.RateLimit.Enabled := True;
  oFirewall.RateLimit.MaxConnectionsPerIP := 5;
  oFirewall.SQLInjection.Enabled := True;
  oFirewall.XSS.Enabled := True;
  // Assign to any server component
  oServer.Firewall := oFirewall;
  oServer.Active := True;
end;

Eenmaal gekoppeld integreert de firewall automatisch: verbindingen worden gecontroleerd voordat ze je event-handlers bereiken, berichten worden in realtime gescand en losgekoppelde clients worden uit het tracking-systeem verwijderd — allemaal zonder een regel event-handling-code te schrijven.

IP-blacklist & -whitelist

De blacklist weigert verbindingen vanaf specifieke IP's of ranges. De whitelist doet het omgekeerde — deze definieert een set vertrouwde adressen die alle andere controles omzeilen, inclusief berichtfiltering.

Beide ondersteunen exacte IP-adressen en CIDR-notatie voor range-filtering:

// Blacklist: block entire subnets and specific IPs
oFirewall.Blacklist.Enabled := True;
oFirewall.Blacklist.IPs.Add('10.0.0.0/8');        // All 10.x.x.x
oFirewall.Blacklist.IPs.Add('172.16.0.0/16');     // All 172.16.x.x
oFirewall.Blacklist.IPs.Add('192.168.1.100');     // Single IP
// Whitelist: trusted IPs bypass everything
oFirewall.Whitelist.Enabled := True;
oFirewall.Whitelist.IPs.Add('192.168.1.1');       // Admin machine
oFirewall.Whitelist.IPs.Add('192.168.1.0/24');    // Internal network

Prioriteit. Wanneer de whitelist is ingeschakeld, wordt deze als eerste gecontroleerd. Als het IP overeenkomt, wordt de verbinding direct toegestaan — blacklist, bans, rate-limits en berichtfilters worden allemaal overgeslagen.

Brute-force-bescherming

De brute-force-module houdt mislukte authenticatiepogingen per IP bij met een schuivend tijdvenster. Wanneer een IP het maximale aantal pogingen binnen het venster overschrijdt, wordt het automatisch verbannen voor een instelbare duur.

EigenschapStandaardBeschrijving
MaxAttempts5Aantal mislukte pogingen voor ban
TimeWindowSec60Schuivend venster in seconden voor het tellen van pogingen
BanDurationSec300Banduur in seconden (0 = permanent)
// Ban after 3 failed logins within 60 seconds, for 10 minutes
oFirewall.BruteForce.Enabled := True;
oFirewall.BruteForce.MaxAttempts := 3;
oFirewall.BruteForce.TimeWindowSec := 60;
oFirewall.BruteForce.BanDurationSec := 600;
// Register failed attempts from your authentication handler
procedure TForm1.ServerAuthentication(Connection: TsgcWSConnection;
  aUser, aPassword: String; var Authenticated: Boolean);
begin
  Authenticated := ValidateCredentials(aUser, aPassword);
  if not Authenticated then
    oFirewall.RegisterFailedAttempt(Connection.IP);
end;

De firewall regelt de rest automatisch: hij telt pogingen, controleert het tijdvenster en verbant het IP wanneer de drempel wordt bereikt. Verbannen IP's worden op connectie-niveau geweigerd voordat verdere verwerking plaatsvindt.

Handmatig banbeheer

Naast automatische bans kun je bans op elk moment programmatisch beheren:

// Ban an IP for 1 hour
oFirewall.BanIP('203.0.113.50', 3600);
// Permanent ban (duration = 0)
oFirewall.BanIP('198.51.100.10');
// Check ban status
if oFirewall.IsBanned('203.0.113.50') then
  WriteLn('IP is banned');
// Remove a specific ban
oFirewall.UnbanIP('203.0.113.50');
// Clear all bans
oFirewall.ClearBans;

SQL-injection-detectie

De SQL-injection-module scant elk inkomend tekstbericht op gangbare aanvalspatronen. Wanneer er een match wordt gedetecteerd, bepaalt de instelbare actie de respons: client blokkeren, event loggen of doorlaten.

oFirewall.SQLInjection.Enabled := True;
oFirewall.SQLInjection.Action := faDeny;  // faDeny, faLog, or faAllow
// Add custom patterns beyond the built-in set
oFirewall.SQLInjection.CustomPatterns.Add('WAITFOR DELAY');
oFirewall.SQLInjection.CustomPatterns.Add('BENCHMARK(');

Ingebouwde patronen

De detector bevat hoofdletter-ongevoelige checks voor de meest voorkomende SQL-injection-technieken:

XSS-detectie

De XSS-module detecteert cross-site-scripting-payloads in WebSocket-berichten voordat ze je toepassingslogica bereiken of naar andere clients worden doorgestuurd.

oFirewall.XSS.Enabled := True;
oFirewall.XSS.Action := faDeny;

Ingebouwde detectie dekt:

Connection-rate-limiting

Beperk het aantal gelijktijdige verbindingen dat één IP-adres kan aanhouden. Dit voorkomt resource-uitputting door clients die te veel verbindingen openen — of het nu kwaadaardig of slecht geconfigureerd is.

// Allow up to 5 concurrent connections per IP
oFirewall.RateLimit.Enabled := True;
oFirewall.RateLimit.MaxConnectionsPerIP := 5;
oFirewall.RateLimit.TimeWindowSec := 60;

Connection-tracking is volledig automatisch: de firewall verhoogt de teller bij connect en verlaagt deze bij disconnect. Wanneer een nieuwe verbinding de limiet zou overschrijden, wordt deze geweigerd voordat het OnConnect-event van de server vuurt.

Message-flood-bescherming

Throttle het aantal berichten dat één IP per seconde kan versturen. Dit beschermt tegen denial-of-service-patronen waarbij een client snel berichten verstuurt om de server of andere verbonden clients te overbelasten.

// Limit to 50 messages per second per IP
oFirewall.FloodProtection.Enabled := True;
oFirewall.FloodProtection.MaxMessagesPerSec := 50;
oFirewall.FloodProtection.Action := faDeny;  // Disconnect offender

Payload-size-limiting

Forceer een maximale berichtgrootte om te voorkomen dat clients te grote payloads versturen die het servergeheugen kunnen uitputten. Berichten die de drempel overschrijden, worden voor verwerking geweigerd.

oFirewall.PayloadLimit.Enabled := True;
oFirewall.PayloadLimit.MaxSizeBytes := 65536;  // 64 KB max
oFirewall.PayloadLimit.Action := faDeny;

Path-traversal-detectie

De path-traversal-module scant inkomende berichten op directory-traversal-sequenties die bestanden buiten de bedoelde scope proberen te benaderen. Dit is cruciaal voor toepassingen die bestandspaden of resource-identifiers uit client-berichten verwerken.

Ingebouwde detectie dekt:

oFirewall.PathTraversal.Enabled := True;
oFirewall.PathTraversal.Action := faDeny;

Command-injection-detectie

De command-injection-module detecteert OS-command-injection-patronen in berichten. Hij vangt shell-metakarakters en gangbare commando-sequenties op die worden gebruikt om willekeurige systeemcommando's uit te voeren.

Ingebouwde detectie dekt:

oFirewall.CommandInjection.Enabled := True;
oFirewall.CommandInjection.Action := faDeny;

GeoIP-landfiltering

Filter verbindingen op basis van hun geografische herkomst met IP-naar-land-resolutie. De GeoIP-module ondersteunt twee modi: BlockList (blokkeer specifieke landen, sta de rest toe) en AllowList (sta alleen specifieke landen toe, blokkeer de rest).

EigenschapBeschrijving
ModegmBlockList of gmAllowList
CountriesISO 3166-1 alpha-2-landcodes (bijv. US, GB, DE)
DatabaseFilePad naar CSV-bestand voor IP-naar-land-resolutie

Specifieke landen blokkeren

oFirewall.GeoIP.Enabled := True;
oFirewall.GeoIP.Mode := gmBlockList;
oFirewall.GeoIP.Countries.Add('CN');
oFirewall.GeoIP.Countries.Add('RU');
oFirewall.LoadGeoIPDatabase('geoip.csv');

Alleen specifieke landen toestaan

// Only allow connections from US, UK, and Germany
oFirewall.GeoIP.Enabled := True;
oFirewall.GeoIP.Mode := gmAllowList;
oFirewall.GeoIP.Countries.Add('US');
oFirewall.GeoIP.Countries.Add('GB');
oFirewall.GeoIP.Countries.Add('DE');
oFirewall.LoadGeoIPDatabase('geoip.csv');

GeoIP-databases. Gratis IP-naar-land-CSV-databases zijn beschikbaar bij providers als DB-IP en IP2Location. Of implementeer het event OnResolveCountry om je eigen resolutielogica te gebruiken.

Threat-score-systeem

Het threat-score-systeem kent gewogen punten toe aan elk overtredingstype en accumuleert per IP-adres een score. Wanneer de score de auto-ban-drempel overschrijdt, wordt het IP automatisch verbannen. Scores nemen na verloop van tijd af, zodat eenmalige incidenten niet leiden tot permanente straffen.

EigenschapStandaardBeschrijving
AutoBanThreshold100Score waarbij het IP automatisch wordt verbannen
DecayPerHour10Punten die per uur inactiviteit worden afgetrokken
oFirewall.ThreatScore.Enabled := True;
oFirewall.ThreatScore.AutoBanThreshold := 80;
oFirewall.ThreatScore.DecayPerHour := 5;

Score-wijzigingen monitoren

Gebruik het event OnThreatScoreChanged om scores in realtime te monitoren en aangepaste actie te ondernemen voordat de auto-ban-drempel wordt bereikt.

procedure TForm1.FirewallThreatScoreChanged(Sender: TObject;
  const aIP: string; const aOldScore, aNewScore: Integer);
begin
  if aNewScore >= 50 then
    LogToFile(Format('[%s] Threat score elevated: %d -> %d',
      [aIP, aOldScore, aNewScore]));
end;

Progressieve ban-escalatie

In plaats van een vaste banduur verlengt de escalatiemodule de banlengte bij elke herhaalde overtreding. Eerstetijders krijgen een korte ban; volhardende overtreders worden geëscaleerd tot een permanente blokkade.

oFirewall.BanEscalation.Enabled := True;
oFirewall.BanEscalation.Levels.Add('300');    // 5 minutes
oFirewall.BanEscalation.Levels.Add('1800');   // 30 minutes
oFirewall.BanEscalation.Levels.Add('7200');   // 2 hours
oFirewall.BanEscalation.Levels.Add('86400');  // 24 hours
oFirewall.BanEscalation.Levels.Add('0');      // permanent

Tip. Combineer progressieve escalatie met het threat-score-systeem voor maximale effectiviteit. De threat-score identificeert kwaadwillenden over meerdere overtredingstypen heen, en de escalatie zorgt ervoor dat herhaalde overtreders steeds zwaardere gevolgen ondervinden.

WebSocket-specifieke bescherming

Naast scanning op berichtniveau biedt de firewall protocol-niveau-beschermingen die specifiek zijn voor WebSocket-verbindingen: origin-validatie, frame-grootte-handhaving en subprotocol-filtering.

// Validate the Origin header to prevent cross-site hijacking
oFirewall.WebSocket.Enabled := True;
oFirewall.WebSocket.AllowedOrigins.Add('https://www.example.com');
oFirewall.WebSocket.AllowedOrigins.Add('https://app.example.com');
// Enforce maximum frame size (bytes)
oFirewall.WebSocket.MaxFrameSize := 131072;  // 128 KB
// Only allow specific subprotocols
oFirewall.WebSocket.AllowedSubProtocols.Add('graphql-ws');
oFirewall.WebSocket.AllowedSubProtocols.Add('mqtt');

Custom-rules-engine

Met de custom-rules-engine kun je je eigen firewall-regels definiëren met condities en geautomatiseerde acties. Elke regel specificeert een overtredingsdrempel binnen een tijdvenster en de actie die moet worden ondernomen wanneer de drempel wordt overschreden.

EigenschapBeschrijving
NameBeschrijvende naam voor de regel
MinViolationsAantal overtredingen dat nodig is om de regel te triggeren
TimeWindowSecSchuivend venster in seconden voor het tellen van overtredingen
ActionTypeTe ondernemen actie: raDeny, raAllow, raBan of raLog
BanDurationSecBanduur wanneer ActionType raBan is

Actietypen:

ActieGedrag
raDenyKoppel de client onmiddellijk los
raAllowGeen actie (regel wordt gevolgd maar niet afgedwongen)
raBanVerban het IP voor de opgegeven duur
raLogVuur alleen het OnViolation-event
var
  vRule: TsgcFirewallRuleItem;
begin
  oFirewall.CustomRules.Enabled := True;
  vRule := TsgcFirewallRuleItem(oFirewall.CustomRules.Rules.Add);
  vRule.Name := 'Block high-risk IPs';
  vRule.MinViolations := 5;
  vRule.TimeWindowSec := 300;
  vRule.ActionType := raBan;
  vRule.BanDurationSec := 3600;
end;

Realtime-statistieken

De firewall stelt een Stats-object beschikbaar met realtime-tellers voor actieve verbindingen, totaal geblokkeerde pogingen en tellers per overtredingstype. Gebruik het om monitoringdashboards te bouwen of periodieke samenvattingen te loggen.

WriteLn('Active: ', oFirewall.Stats.ActiveConnections);
WriteLn('Blocked: ', oFirewall.Stats.TotalBlocked);
WriteLn('SQL Injection: ', oFirewall.Stats.GetViolationCount(fvSQLInjection));

Persistente bans

Standaard worden bans in het geheugen opgeslagen en bij een herstart gewist. Gebruik SaveBansToFile en LoadBansFromFile om bans tussen server-herstarts te behouden.

// Save bans before shutdown
oFirewall.SaveBansToFile('bans.dat');
// Restore bans on startup
oFirewall.LoadBansFromFile('bans.dat');

Actiemodi

De SQL-injection-, XSS- en flood-protection-modules ondersteunen drie instelbare acties wanneer er een overtreding wordt gedetecteerd:

ActieGedragUse case
faDenyBlokkeer en koppel de client losProductieservers
faLogVuur het OnViolation-event maar sta de verbinding toeMonitoring, testing, geleidelijke uitrol
faAllowGeen actieEen module tijdelijk uitschakelen zonder de configuratie te verwijderen

Tip. Begin in productie met faLog om te observeren hoe de firewall reageert op je echte verkeer voordat je naar faDeny overstapt. Zo voorkom je dat legitieme gebruikers tijdens de initiële uitrol worden geblokkeerd.

Events — logging & overrides

Events geven je volledige inzicht in firewall-beslissingen en de mogelijkheid om ze waar nodig te overschrijven.

OnViolation — security-logging

Wordt afgevuurd bij elke gedetecteerde overtreding. Gebruik het om security-logs te schrijven, meldingen te versturen of een monitoringdashboard te voeden.

procedure TForm1.FirewallViolation(Sender: TObject;
  const aIP: string;
  const aViolationType: TsgcFirewallViolationType;
  const aDetails: string);
begin
  LogToFile(Format('[%s] Firewall: %s - %s',
    [aIP, ViolationTypeToStr(aViolationType), aDetails]));
end;

Overtredingstypen omvatten:

TypeWordt getriggerd wanneer
fvBlacklistIP staat in de blacklist
fvBruteForceDrempel voor mislukte pogingen overschreden
fvRateLimitConnection-rate-limit overschreden
fvFloodMessage-flood gedetecteerd
fvSQLInjectionSQL-injection-patroon gedetecteerd
fvXSSXSS-patroon gedetecteerd
fvGeoIPVerbinding geblokkeerd door landfilter
fvPathTraversalPath-traversal-patroon gedetecteerd
fvCommandInjectionCommand-injection-patroon gedetecteerd
fvPayloadSizeBericht overschrijdt maximale payload-grootte
fvOriginWebSocket-origin niet in de toegestane lijst
fvFrameSizeWebSocket-frame overschrijdt maximale grootte
fvThreatScoreThreat-score overschreed auto-ban-drempel
fvCustomRuleCustom-rule-drempel overschreden

OnFiltered — beslissingen overschrijven

Wordt afgevuurd wanneer een verbinding of bericht op het punt staat te worden geblokkeerd. Met de parameter Allow kun je de beslissing van de firewall tijdens runtime overschrijven.

procedure TForm1.FirewallFiltered(Sender: TObject;
  const aIP: string; const aReason: string;
  var Allow: Boolean);
begin
  // Override: always allow the office IP even if rate-limited
  if aIP = '203.0.113.10' then
    Allow := True;
end;

OnResolveCountry — aangepaste GeoIP-resolutie

Wordt afgevuurd wanneer de GeoIP-module een IP-adres moet resolveren naar een landcode. Gebruik dit om je eigen resolutielogica te implementeren in plaats van (of naast) de ingebouwde CSV-database.

procedure TForm1.FirewallResolveCountry(Sender: TObject;
  const aIP: string; var aCountryCode: string);
begin
  aCountryCode := MyGeoIPLookup(aIP);
end;

OnThreatScoreChanged — score-monitoring

Wordt afgevuurd telkens wanneer de threat-score van een IP verandert. Gebruik dit om aangepaste drempels, meldingen of graduële reacties te implementeren voordat de auto-ban-drempel wordt bereikt.

procedure TForm1.FirewallThreatScoreChanged(Sender: TObject;
  const aIP: string; const aOldScore, aNewScore: Integer);
begin
  if aNewScore >= 50 then
    SendAlert(Format('IP %s threat score: %d', [aIP, aNewScore]));
end;

Server-integratie

De firewall werkt met alle drie de server-componenten. Eén enkele firewall-instance kan zelfs over meerdere servers worden gedeeld.

ComponentBeschrijving
TsgcWebSocketHTTPServerWebSocket- + HTTP-server (Indy-gebaseerd)
TsgcWebSocketServerPure WebSocket-server (Indy-TCP)
TsgcWebSocketServer_HTTPAPIWebSocket-server met de HTTP.SYS-kernel-driver

De integratie is automatisch zodra deze is gekoppeld. De firewall onderschept op drie punten:

Compleet voorbeeld

Een volledig geconfigureerde WebSocket-server met de kern-beschermingsmodules en de nieuwe geavanceerde functies ingeschakeld.

uses
  sgcWebSocket_Server, sgcWebSocket_Server_Firewall;
var
  oFirewall: TsgcWSFirewall;
  oServer: TsgcWebSocketHTTPServer;
begin
  oFirewall := TsgcWSFirewall.Create(nil);
  oServer := TsgcWebSocketHTTPServer.Create(nil);
  Try
    // IP filtering
    oFirewall.Blacklist.Enabled := True;
    oFirewall.Blacklist.IPs.Add('10.0.0.0/8');
    oFirewall.Whitelist.Enabled := True;
    oFirewall.Whitelist.IPs.Add('192.168.1.0/24');
    // Brute force: ban after 3 failures in 60s, for 10 minutes
    oFirewall.BruteForce.Enabled := True;
    oFirewall.BruteForce.MaxAttempts := 3;
    oFirewall.BruteForce.BanDurationSec := 600;
    // Message security
    oFirewall.SQLInjection.Enabled := True;
    oFirewall.XSS.Enabled := True;
    // Rate limiting and flood protection
    oFirewall.RateLimit.Enabled := True;
    oFirewall.RateLimit.MaxConnectionsPerIP := 5;
    oFirewall.FloodProtection.Enabled := True;
    oFirewall.FloodProtection.MaxMessagesPerSec := 50;
    // Payload size limit
    oFirewall.PayloadLimit.Enabled := True;
    oFirewall.PayloadLimit.MaxSizeBytes := 65536;
    // GeoIP: block specific countries
    oFirewall.GeoIP.Enabled := True;
    oFirewall.GeoIP.Mode := gmBlockList;
    oFirewall.GeoIP.Countries.Add('CN');
    oFirewall.GeoIP.Countries.Add('RU');
    oFirewall.LoadGeoIPDatabase('geoip.csv');
    // Threat scoring with auto-ban
    oFirewall.ThreatScore.Enabled := True;
    oFirewall.ThreatScore.AutoBanThreshold := 80;
    oFirewall.ThreatScore.DecayPerHour := 5;
    // Progressive ban escalation
    oFirewall.BanEscalation.Enabled := True;
    oFirewall.BanEscalation.Levels.Add('300');
    oFirewall.BanEscalation.Levels.Add('3600');
    oFirewall.BanEscalation.Levels.Add('86400');
    oFirewall.BanEscalation.Levels.Add('0');
    // Restore persistent bans
    oFirewall.LoadBansFromFile('bans.dat');
    // Events
    oFirewall.OnViolation := FirewallViolation;
    oFirewall.OnFiltered := FirewallFiltered;
    oFirewall.OnThreatScoreChanged := FirewallThreatScoreChanged;
    // Assign to server and start
    oServer.Port := 443;
    oServer.Firewall := oFirewall;
    oServer.Active := True;
    WriteLn('Server running with firewall protection.');
    ReadLn;
    // Save bans before shutdown
    oFirewall.SaveBansToFile('bans.dat');
  Finally
    oServer.Active := False;
    oServer.Free;
    oFirewall.Free;
  End;
end;

Thread-veiligheid

Het firewall-component is volledig thread-safe. Alle publieke methoden gebruiken interne critical sections om gelijktijdige toegang tot tracking-data te beschermen. Het is stress-getest met 20 gelijktijdige threads die 100.000 operaties uitvoeren, zonder fouten en zonder memory leaks.

Het component kan veilig over meerdere server-instances worden gedeeld en vanuit elke thread worden benaderd — server-event-handlers, timer-threads, achtergrondwerkers — zonder externe synchronisatie.

Belangrijke opmerkingen