Firewall per i server sgcWebSockets

· Componenti

La sicurezza non è più opzionale. Ogni server WebSocket esposto a Internet è un bersaglio per attacchi brute force, tentativi di injection, connection flooding e abusi automatici. Difendersi da queste minacce richiede tipicamente di aggiungere strumenti esterni, middleware, scrivere logica di filtro personalizzata o deployare un reverse proxy separato, tutte cose che aggiungono complessità e rallentano lo sviluppo.

sgcWebSockets 2026.4.0 introduce TsgcWSFirewall: un componente firewall dedicato che si integra direttamente nel tuo server WebSocket, ora con 15 moduli di protezione tra cui filtro per paese GeoIP, threat scoring adattivo, escalation progressiva dei ban e un motore di regole personalizzate. Trascina il componente, configura i moduli di protezione che ti servono, assegnalo al server e la tua applicazione è protetta. Niente dipendenze esterne. Niente middleware. Niente codice personalizzato per i casi comuni.

Questo articolo copre l'intera dotazione di funzionalità e mostra come configurare ogni modulo di protezione in Delphi.

Quindici moduli di protezione, un solo componente

Il firewall fornisce quindici moduli di protezione indipendenti. Abilita solo ciò di cui hai bisogno: ogni modulo funziona da solo o in combinazione con gli altri.

Blacklist IP
Blocca specifici indirizzi IP o interi range usando la notazione CIDR. Le connessioni da IP in blacklist vengono rifiutate prima di raggiungere il codice della tua applicazione.
Whitelist IP
Definisci un elenco di IP fidati. Quando abilitato, gli indirizzi in whitelist bypassano tutti gli altri controlli di sicurezza: ideale per servizi interni e strumenti di monitoraggio.
Protezione brute force
Traccia i tentativi di autenticazione falliti per IP. Banna automaticamente i trasgressori dopo una soglia configurabile entro una finestra temporale scorrevole.
Rilevamento SQL injection
Scansiona i messaggi in arrivo cercando pattern comuni di SQL injection. Rilevamento integrato per boolean injection, UNION SELECT, statement injection e altro.
Rilevamento XSS
Rileva payload di cross-site scripting nei messaggi. Cattura tag script, event handler, URI con protocollo JavaScript, iframe injection ed espressioni CSS.
Rate limiting delle connessioni
Limita il numero di connessioni simultanee per indirizzo IP. Impedisce a un singolo client di esaurire le risorse del server.
Protezione dal flood di messaggi
Limita il numero di messaggi che un singolo IP può inviare al secondo. Protegge da message flooding e pattern di denial-of-service.
Limite di dimensione del payload
Rifiuta i messaggi che superano una soglia massima di dimensione. Evita l'esaurimento della memoria da payload sovradimensionati.
Rilevamento path traversal
Rileva sequenze di directory traversal nei messaggi. Blocca i tentativi di accedere a file al di fuori dell'ambito previsto.
Rilevamento command injection
Rileva pattern di OS command injection nei messaggi. Blocca metacaratteri di shell e sequenze di comando comuni.
Filtro per paese GeoIP
Consente o blocca le connessioni in base all'origine geografica. Supporta modalità blocklist e allowlist con lookup da database CSV.
Sistema di threat score
Accumula punteggi pesati per IP attraverso tutti i tipi di violazione. Auto-ban quando si raggiunge una soglia, con decadimento automatico nel tempo.
Escalation progressiva del ban
Aumenta la durata del ban a ogni offesa ripetuta. Passa da ban brevi a blocchi permanenti per i trasgressori persistenti.
Protezione WebSocket
Valida le origin WebSocket, impone limiti sulla dimensione dei frame e filtra i sottoprotocolli. Protezione a livello di protocollo oltre il contenuto del messaggio.
Motore di regole personalizzate
Definisci le tue regole firewall con condizioni e azioni. Crea soglie di violazione, finestre temporali e risposte automatizzate.

Guida rapida

Mettere in funzione il firewall richiede solo tre passi: crea, configura e assegna.

var
  oFirewall: TsgcWSFirewall;
  oServer: TsgcWebSocketHTTPServer;
begin
  oFirewall := TsgcWSFirewall.Create(nil);
  oFirewall.Enabled := True;
  // Abilita i moduli di cui hai bisogno
  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;
  // Assegna a qualsiasi componente server
  oServer.Firewall := oFirewall;
  oServer.Active := True;
end;

Una volta assegnato, il firewall si integra automaticamente: le connessioni sono controllate prima di raggiungere i tuoi event handler, i messaggi vengono scansionati in tempo reale, e i client disconnessi vengono deregistrati dal tracking, tutto senza scrivere una singola riga di codice di gestione eventi.

Blacklist e whitelist IP

La blacklist rifiuta le connessioni da specifici IP o range. La whitelist fa l'opposto: definisce un insieme fidato di indirizzi che bypassano tutti gli altri controlli, incluso il filtraggio dei messaggi.

Entrambe supportano indirizzi IP esatti e notazione CIDR per il filtro basato su range:

// Blacklist: blocca intere subnet e IP specifici
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: gli IP fidati bypassano tutto
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

Priorità. Quando la whitelist è abilitata, viene controllata per prima. Se l'IP corrisponde, la connessione è consentita immediatamente: blacklist, ban, rate limit e filtri sui messaggi vengono saltati.

Protezione brute force

Il modulo brute force traccia i tentativi di autenticazione falliti per IP usando una finestra temporale scorrevole. Quando un IP supera il numero massimo di tentativi entro la finestra, viene bannato automaticamente per una durata configurabile.

Proprietà Predefinito Descrizione
MaxAttempts 5 Tentativi falliti prima del ban
TimeWindowSec 60 Finestra scorrevole in secondi per contare i tentativi
BanDurationSec 300 Durata del ban in secondi (0 = permanente)
// Banna dopo 3 login falliti entro 60 secondi, per 10 minuti
oFirewall.BruteForce.Enabled := True;
oFirewall.BruteForce.MaxAttempts := 3;
oFirewall.BruteForce.TimeWindowSec := 60;
oFirewall.BruteForce.BanDurationSec := 600;
// Registra i tentativi falliti dal tuo handler di autenticazione
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;

Il firewall gestisce automaticamente il resto: conta i tentativi, controlla la finestra temporale e banna l'IP quando viene raggiunta la soglia. Gli IP bannati vengono rifiutati a livello di connessione prima di qualsiasi ulteriore elaborazione.

Gestione manuale dei ban

Oltre ai ban automatici, puoi gestire i ban a livello programmatico in qualsiasi momento:

// Banna un IP per 1 ora
oFirewall.BanIP('203.0.113.50', 3600);
// Ban permanente (durata = 0)
oFirewall.BanIP('198.51.100.10');
// Controlla lo stato di ban
if oFirewall.IsBanned('203.0.113.50') then
  WriteLn('IP is banned');
// Rimuove uno specifico ban
oFirewall.UnbanIP('203.0.113.50');
// Cancella tutti i ban
oFirewall.ClearBans;

Rilevamento SQL injection

Il modulo SQL injection scansiona ogni messaggio testuale in arrivo cercando pattern di attacco comuni. Quando viene rilevata una corrispondenza, l'azione configurabile determina la risposta: blocca il client, logga l'evento o lascia passare.

oFirewall.SQLInjection.Enabled := True;
oFirewall.SQLInjection.Action := faDeny;  // faDeny, faLog, or faAllow
// Aggiungi pattern personalizzati oltre l'insieme integrato
oFirewall.SQLInjection.CustomPatterns.Add('WAITFOR DELAY');
oFirewall.SQLInjection.CustomPatterns.Add('BENCHMARK(');

Pattern integrati

Il rilevatore include controlli case-insensitive per le tecniche di SQL injection più comuni:

Rilevamento XSS

Il modulo XSS rileva payload di cross-site scripting nei messaggi WebSocket prima che possano raggiungere la logica della tua applicazione o essere inoltrati ad altri client.

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

Il rilevamento integrato copre:

Rate limiting delle connessioni

Limita il numero di connessioni simultanee che un singolo indirizzo IP può tenere aperte. Questo previene l'esaurimento delle risorse da parte di client che aprono connessioni eccessive, siano essi malevoli o malconfigurati.

// Consenti fino a 5 connessioni simultanee per IP
oFirewall.RateLimit.Enabled := True;
oFirewall.RateLimit.MaxConnectionsPerIP := 5;
oFirewall.RateLimit.TimeWindowSec := 60;

Il tracking delle connessioni è completamente automatico: il firewall incrementa il contatore alla connessione e lo decrementa alla disconnessione. Quando una nuova connessione supererebbe il limite, viene rifiutata prima che l'evento OnConnect del server venga generato.

Protezione dal flood di messaggi

Limita il numero di messaggi che un singolo IP può inviare al secondo. Questo protegge da pattern di denial-of-service in cui un client invia rapidamente messaggi per sovraccaricare il server o altri client connessi.

// Limita a 50 messaggi al secondo per IP
oFirewall.FloodProtection.Enabled := True;
oFirewall.FloodProtection.MaxMessagesPerSec := 50;
oFirewall.FloodProtection.Action := faDeny;  // Disconnette il trasgressore

Limite di dimensione del payload

Imponi una dimensione massima dei messaggi per impedire ai client di inviare payload sovradimensionati che potrebbero esaurire la memoria del server. I messaggi che superano la soglia vengono rifiutati prima dell'elaborazione.

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

Rilevamento path traversal

Il modulo path traversal scansiona i messaggi in arrivo cercando sequenze di directory traversal che tentano di accedere a file al di fuori dell'ambito previsto. È critico per le applicazioni che elaborano percorsi di file o identificatori di risorse dai messaggi dei client.

Il rilevamento integrato copre:

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

Rilevamento command injection

Il modulo command injection rileva pattern di OS command injection nei messaggi. Cattura metacaratteri di shell e sequenze di comando comuni usate per eseguire comandi di sistema arbitrari.

Il rilevamento integrato copre:

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

Filtro per paese GeoIP

Filtra le connessioni in base alla loro origine geografica usando la risoluzione IP-paese. Il modulo GeoIP supporta due modalità: BlockList (blocca paesi specifici, consenti tutto il resto) e AllowList (consenti solo paesi specifici, blocca tutto il resto).

Proprietà Descrizione
Mode gmBlockList o gmAllowList
Countries Codici paese ISO 3166-1 alpha-2 (es. US, GB, DE)
DatabaseFile Percorso del file CSV per la risoluzione IP-paese

Bloccare paesi specifici

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

Consentire solo paesi specifici

// Consenti connessioni solo da Stati Uniti, Regno Unito e Germania
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');

Database GeoIP. Database CSV gratuiti IP-paese sono disponibili da provider come DB-IP e IP2Location. In alternativa, implementa l'evento OnResolveCountry per usare la tua logica di risoluzione.

Sistema di threat score

Il sistema di threat score assegna punti pesati a ogni tipo di violazione e accumula un punteggio per indirizzo IP. Quando il punteggio supera la soglia di auto-ban, l'IP viene bannato automaticamente. I punteggi decadono nel tempo, così gli incidenti isolati non comportano penalità permanenti.

Proprietà Predefinito Descrizione
AutoBanThreshold 100 Punteggio al quale l'IP viene bannato automaticamente
DecayPerHour 10 Punti sottratti per ora di inattività
oFirewall.ThreatScore.Enabled := True;
oFirewall.ThreatScore.AutoBanThreshold := 80;
oFirewall.ThreatScore.DecayPerHour := 5;

Monitoraggio dei cambi di punteggio

Usa l'evento OnThreatScoreChanged per monitorare i punteggi in tempo reale e intraprendere azioni personalizzate prima che venga raggiunta la soglia di auto-ban.

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;

Escalation progressiva del ban

Invece di una durata fissa del ban, il modulo di escalation aumenta la lunghezza del ban a ogni offesa ripetuta. I trasgressori alla prima volta ricevono un ban breve; i trasgressori persistenti vengono fatti salire fino a un blocco permanente.

oFirewall.BanEscalation.Enabled := True;
oFirewall.BanEscalation.Levels.Add('300');    // 5 minuti
oFirewall.BanEscalation.Levels.Add('1800');   // 30 minuti
oFirewall.BanEscalation.Levels.Add('7200');   // 2 ore
oFirewall.BanEscalation.Levels.Add('86400');  // 24 ore
oFirewall.BanEscalation.Levels.Add('0');      // permanente

Suggerimento. Combina l'escalation progressiva con il sistema di threat score per la massima efficacia. Il threat score identifica i malintenzionati attraverso più tipi di violazione, e l'escalation assicura che i recidivi affrontino conseguenze sempre più severe.

Protezione specifica per WebSocket

Oltre alla scansione a livello di messaggio, il firewall fornisce protezioni a livello di protocollo specifiche per le connessioni WebSocket: validazione dell'origin, imposizione della dimensione dei frame e filtro dei sottoprotocolli.

// Valida l'header Origin per evitare il cross-site hijacking
oFirewall.WebSocket.Enabled := True;
oFirewall.WebSocket.AllowedOrigins.Add('https://www.example.com');
oFirewall.WebSocket.AllowedOrigins.Add('https://app.example.com');
// Imponi una dimensione massima del frame (in byte)
oFirewall.WebSocket.MaxFrameSize := 131072;  // 128 KB
// Consenti solo sottoprotocolli specifici
oFirewall.WebSocket.AllowedSubProtocols.Add('graphql-ws');
oFirewall.WebSocket.AllowedSubProtocols.Add('mqtt');

Motore di regole personalizzate

Il motore di regole personalizzate ti permette di definire le tue regole firewall con condizioni e azioni automatizzate. Ogni regola specifica una soglia di violazione entro una finestra temporale e l'azione da intraprendere quando la soglia viene superata.

Proprietà Descrizione
Name Nome descrittivo della regola
MinViolations Numero di violazioni richieste per attivare la regola
TimeWindowSec Finestra scorrevole in secondi per contare le violazioni
ActionType Azione da intraprendere: raDeny, raAllow, raBan o raLog
BanDurationSec Durata del ban quando ActionType è raBan

Tipi di azione:

Azione Comportamento
raDeny Disconnette immediatamente il client
raAllow Nessuna azione (la regola è tracciata ma non applicata)
raBan Banna l'IP per la durata specificata
raLog Genera solo l'evento OnViolation
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;

Statistiche in tempo reale

Il firewall espone un oggetto Stats con contatori in tempo reale per connessioni attive, totale tentativi bloccati e conteggi per tipo di violazione. Usalo per costruire dashboard di monitoraggio o per loggare riepiloghi periodici.

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

Ban persistenti

Di default, i ban sono memorizzati in memoria e cancellati al riavvio. Usa SaveBansToFile e LoadBansFromFile per persistere i ban attraverso i riavvii del server.

// Salva i ban prima dello shutdown
oFirewall.SaveBansToFile('bans.dat');
// Ripristina i ban all'avvio
oFirewall.LoadBansFromFile('bans.dat');

Modalità di azione

I moduli SQL injection, XSS e protezione dal flood supportano tre azioni configurabili quando viene rilevata una violazione:

Azione Comportamento Caso d'uso
faDeny Blocca e disconnette il client Server di produzione
faLog Genera l'evento OnViolation ma consente la connessione Monitoraggio, test, rollout graduale
faAllow Nessuna azione Disabilita temporaneamente un modulo senza rimuovere la configurazione

Suggerimento. Inizia con faLog in produzione per osservare come il firewall reagisce al tuo traffico reale prima di passare a faDeny. Questo evita di bloccare utenti legittimi durante il deploy iniziale.

Eventi — logging e override

Gli eventi ti danno piena visibilità sulle decisioni del firewall e la possibilità di sovrascriverle quando necessario.

OnViolation — logging di sicurezza

Generato a ogni violazione rilevata. Usalo per scrivere log di sicurezza, inviare alert o alimentare una dashboard di monitoraggio.

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;

I tipi di violazione includono:

Tipo Si attiva quando
fvBlacklist L'IP è nella blacklist
fvBruteForce Soglia di tentativi falliti superata
fvRateLimit Limite di rate delle connessioni superato
fvFlood Flood di messaggi rilevato
fvSQLInjection Pattern di SQL injection rilevato
fvXSS Pattern XSS rilevato
fvGeoIP Connessione bloccata dal filtro per paese
fvPathTraversal Pattern di path traversal rilevato
fvCommandInjection Pattern di command injection rilevato
fvPayloadSize Il messaggio supera la dimensione massima del payload
fvOrigin Origin WebSocket non nell'elenco consentito
fvFrameSize Il frame WebSocket supera la dimensione massima
fvThreatScore Threat score superiore alla soglia di auto-ban
fvCustomRule Soglia di regola personalizzata superata

OnFiltered — sovrascrivere le decisioni

Generato quando una connessione o un messaggio sta per essere bloccato. Il parametro Allow ti permette di sovrascrivere la decisione del firewall a runtime.

procedure TForm1.FirewallFiltered(Sender: TObject;
  const aIP: string; const aReason: string;
  var Allow: Boolean);
begin
  // Override: consenti sempre l'IP dell'ufficio anche se rate-limited
  if aIP = '203.0.113.10' then
    Allow := True;
end;

OnResolveCountry — risoluzione GeoIP personalizzata

Generato quando il modulo GeoIP deve risolvere un indirizzo IP in un codice paese. Usalo per implementare la tua logica di risoluzione al posto di (o in aggiunta a) il database CSV integrato.

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

OnThreatScoreChanged — monitoraggio dei punteggi

Generato ogni volta che cambia il threat score di un IP. Usalo per implementare soglie personalizzate, alert o risposte graduali prima che venga raggiunta la soglia di auto-ban.

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;

Integrazione del server

Il firewall funziona con tutti e tre i componenti server. Una singola istanza di firewall può anche essere condivisa tra più server.

Componente Descrizione
TsgcWebSocketHTTPServer Server WebSocket + HTTP (basato su Indy)
TsgcWebSocketServer Server WebSocket puro (Indy TCP)
TsgcWebSocketServer_HTTPAPI Server WebSocket che usa il driver kernel HTTP.SYS

L'integrazione è automatica una volta assegnato. Il firewall intercetta in tre punti:

Esempio completo

Un server WebSocket completamente configurato con i moduli di protezione principali e le nuove funzionalità avanzate abilitate.

uses
  sgcWebSocket_Server, sgcWebSocket_Server_Firewall;
var
  oFirewall: TsgcWSFirewall;
  oServer: TsgcWebSocketHTTPServer;
begin
  oFirewall := TsgcWSFirewall.Create(nil);
  oServer := TsgcWebSocketHTTPServer.Create(nil);
  Try
    // Filtro IP
    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 dopo 3 fallimenti in 60s, per 10 minuti
    oFirewall.BruteForce.Enabled := True;
    oFirewall.BruteForce.MaxAttempts := 3;
    oFirewall.BruteForce.BanDurationSec := 600;
    // Sicurezza dei messaggi
    oFirewall.SQLInjection.Enabled := True;
    oFirewall.XSS.Enabled := True;
    // Rate limiting e protezione dal flood
    oFirewall.RateLimit.Enabled := True;
    oFirewall.RateLimit.MaxConnectionsPerIP := 5;
    oFirewall.FloodProtection.Enabled := True;
    oFirewall.FloodProtection.MaxMessagesPerSec := 50;
    // Limite di dimensione del payload
    oFirewall.PayloadLimit.Enabled := True;
    oFirewall.PayloadLimit.MaxSizeBytes := 65536;
    // GeoIP: blocca paesi specifici
    oFirewall.GeoIP.Enabled := True;
    oFirewall.GeoIP.Mode := gmBlockList;
    oFirewall.GeoIP.Countries.Add('CN');
    oFirewall.GeoIP.Countries.Add('RU');
    oFirewall.LoadGeoIPDatabase('geoip.csv');
    // Threat scoring con auto-ban
    oFirewall.ThreatScore.Enabled := True;
    oFirewall.ThreatScore.AutoBanThreshold := 80;
    oFirewall.ThreatScore.DecayPerHour := 5;
    // Escalation progressiva dei ban
    oFirewall.BanEscalation.Enabled := True;
    oFirewall.BanEscalation.Levels.Add('300');
    oFirewall.BanEscalation.Levels.Add('3600');
    oFirewall.BanEscalation.Levels.Add('86400');
    oFirewall.BanEscalation.Levels.Add('0');
    // Ripristina i ban persistenti
    oFirewall.LoadBansFromFile('bans.dat');
    // Eventi
    oFirewall.OnViolation := FirewallViolation;
    oFirewall.OnFiltered := FirewallFiltered;
    oFirewall.OnThreatScoreChanged := FirewallThreatScoreChanged;
    // Assegna al server e avvia
    oServer.Port := 443;
    oServer.Firewall := oFirewall;
    oServer.Active := True;
    WriteLn('Server running with firewall protection.');
    ReadLn;
    // Salva i ban prima dello shutdown
    oFirewall.SaveBansToFile('bans.dat');
  Finally
    oServer.Active := False;
    oServer.Free;
    oFirewall.Free;
  End;
end;

Thread safety

Il componente firewall è completamente thread-safe. Tutti i metodi pubblici usano sezioni critiche interne per proteggere l'accesso concorrente ai dati di tracking. È stato sottoposto a stress test con 20 thread concorrenti che eseguono 100.000 operazioni con zero errori e zero memory leak.

Il componente può essere condiviso in modo sicuro tra più istanze di server e accessibile da qualsiasi thread (event handler del server, thread del timer, background worker) senza sincronizzazione esterna.

Note importanti