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.
| Eigenschap | Standaard | Beschrijving |
|---|---|---|
| MaxAttempts | 5 | Aantal mislukte pogingen voor ban |
| TimeWindowSec | 60 | Schuivend venster in seconden voor het tellen van pogingen |
| BanDurationSec | 300 | Banduur 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:
- ' OR ', ' AND ' — boolean-injectie
- UNION SELECT — union-gebaseerde injectie
- '; DROP, '; DELETE, '; INSERT, '; UPDATE — statement-injectie
- EXEC(, EXECUTE( — commando-uitvoering
- xp_cmdshell — extended stored procedures
- CAST(, CONVERT( — type-conversie-misbruik
- 1=1, 1'='1 — tautologie-injectie
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:
- , <strong style="color:#2c2c2c;">javascript: — script-injectie
- onerror=, onload=, onclick=, onmouseover= — event-handler-injectie
- eval(, document.cookie — JavaScript-evaluatie en cookie-diefstal
- — element-injectie
- , expression( — SVG- en CSS-expression-aanvallen
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:
- ../, ..\ — relatieve path-traversal
- %2e%2e, %252e — URL-gecodeerde traversal
- /etc/passwd, /etc/shadow — Unix-systeembestand-toegang
- cmd.exe, boot.ini — Windows-systeembestand-toegang
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:
- ; |, &&, || — shell-commando-chaining
- $(command), `command` — commando-substitutie
- wget, curl, nc, netcat — aanroep van netwerk-utilities
- /bin/sh, /bin/bash, cmd /c — shell-spawning
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).
| Eigenschap | Beschrijving |
|---|---|
| Mode | gmBlockList of gmAllowList |
| Countries | ISO 3166-1 alpha-2-landcodes (bijv. US, GB, DE) |
| DatabaseFile | Pad 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.
| Eigenschap | Standaard | Beschrijving |
|---|---|---|
| AutoBanThreshold | 100 | Score waarbij het IP automatisch wordt verbannen |
| DecayPerHour | 10 | Punten 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.
| Eigenschap | Beschrijving |
|---|---|
| Name | Beschrijvende naam voor de regel |
| MinViolations | Aantal overtredingen dat nodig is om de regel te triggeren |
| TimeWindowSec | Schuivend venster in seconden voor het tellen van overtredingen |
| ActionType | Te ondernemen actie: raDeny, raAllow, raBan of raLog |
| BanDurationSec | Banduur wanneer ActionType raBan is |
Actietypen:
| Actie | Gedrag |
|---|---|
raDeny | Koppel de client onmiddellijk los |
raAllow | Geen actie (regel wordt gevolgd maar niet afgedwongen) |
raBan | Verban het IP voor de opgegeven duur |
raLog | Vuur 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:
| Actie | Gedrag | Use case |
|---|---|---|
faDeny | Blokkeer en koppel de client los | Productieservers |
faLog | Vuur het OnViolation-event maar sta de verbinding toe | Monitoring, testing, geleidelijke uitrol |
faAllow | Geen actie | Een 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:
| Type | Wordt getriggerd wanneer |
|---|---|
fvBlacklist | IP staat in de blacklist |
fvBruteForce | Drempel voor mislukte pogingen overschreden |
fvRateLimit | Connection-rate-limit overschreden |
fvFlood | Message-flood gedetecteerd |
fvSQLInjection | SQL-injection-patroon gedetecteerd |
fvXSS | XSS-patroon gedetecteerd |
fvGeoIP | Verbinding geblokkeerd door landfilter |
fvPathTraversal | Path-traversal-patroon gedetecteerd |
fvCommandInjection | Command-injection-patroon gedetecteerd |
fvPayloadSize | Bericht overschrijdt maximale payload-grootte |
fvOrigin | WebSocket-origin niet in de toegestane lijst |
fvFrameSize | WebSocket-frame overschrijdt maximale grootte |
fvThreatScore | Threat-score overschreed auto-ban-drempel |
fvCustomRule | Custom-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.
| Component | Beschrijving |
|---|---|
TsgcWebSocketHTTPServer | WebSocket- + HTTP-server (Indy-gebaseerd) |
TsgcWebSocketServer | Pure WebSocket-server (Indy-TCP) |
TsgcWebSocketServer_HTTPAPI | WebSocket-server met de HTTP.SYS-kernel-driver |
De integratie is automatisch zodra deze is gekoppeld. De firewall onderschept op drie punten:
- Bij nieuwe verbinding: controleert blacklist, whitelist, bans, GeoIP, rate-limits en WebSocket-origin. Weigert voor het OnConnect-event als geblokkeerd.
- Bij bericht-ontvangst: controleert SQL-injection, XSS, command-injection, path-traversal, payload-grootte en flood-limieten. Koppelt de client los bij overtreding.
- Bij disconnect: verwijdert de verbinding uit interne tracking-tellers.
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
- Alleen tekstberichten. SQL-injection- en XSS-detectie scannen tekstberichten. Binaire berichten worden niet gescand.
- Persistente bans. Gebruik
SaveBansToFileenLoadBansFromFileom bans tussen server-herstarts te behouden. Zonder deze aanroepen worden bans alleen in het geheugen opgeslagen en bij herstart gewist. - Whitelist-prioriteit. Whitelisted-IP's omzeilen alle controles, inclusief filtering op berichtniveau. Gebruik dit met zorg.
- RegisterFailedAttempt. De brute-force-module vereist dat je
RegisterFailedAttemptaanroept vanuit je authenticatie-handler. Al het andere is automatisch. - GeoIP-database. Laad een CSV-database met
LoadGeoIPDatabasevoor landresolutie, of implementeer het eventOnResolveCountryvoor aangepaste lookup-logica. - Threat-score-decay. Scores nemen automatisch af na verloop van tijd. Pas
DecayPerHouraan op je verkeerspatronen — high-traffic-servers kunnen baat hebben bij snellere decay om false positives te voorkomen. - Editie-beschikbaarheid. Het firewall-component is beschikbaar in de Professional-, Enterprise- en All-Access-edities van sgcWebSockets.
