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:
- ' OR ', ' AND ' — injection booleana
- UNION SELECT — injection basata su union
- '; DROP, '; DELETE, '; INSERT, '; UPDATE — statement injection
- EXEC(, EXECUTE( — esecuzione di comandi
- xp_cmdshell — stored procedure estese
- CAST(, CONVERT( — abuso di conversione di tipo
- 1=1, 1'='1 — injection tautologica
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:
- , <strong style="color:#2c2c2c;">javascript: — injection di script
- onerror=, onload=, onclick=, onmouseover= — injection di event handler
- eval(, document.cookie — valutazione JavaScript e furto di cookie
- — injection di elementi
- , expression( — attacchi SVG ed espressioni CSS
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:
- ../, ..\ — path traversal relativo
- %2e%2e, %252e — traversal URL-encoded
- /etc/passwd, /etc/shadow — accesso a file di sistema Unix
- cmd.exe, boot.ini — accesso a file di sistema Windows
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:
- ; |, &&, || — concatenazione di comandi shell
- $(command), `command` — sostituzione di comando
- wget, curl, nc, netcat — invocazione di utility di rete
- /bin/sh, /bin/bash, cmd /c — spawning di shell
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:
- Su nuova connessione: controlla blacklist, whitelist, ban, GeoIP, rate limit e origin WebSocket. Rifiuta prima dell'evento OnConnect se bloccata.
- Su messaggio ricevuto: controlla SQL injection, XSS, command injection, path traversal, dimensione del payload e limiti di flood. Disconnette il client in caso di violazione.
- Alla disconnessione: deregistra la connessione dai contatori di tracking interni.
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
- Solo messaggi di testo. Il rilevamento SQL injection e XSS scansiona i messaggi di testo. I messaggi binari non vengono scansionati.
- Ban persistenti. Usa
SaveBansToFileeLoadBansFromFileper persistere i ban attraverso i riavvii del server. Senza queste chiamate, i ban sono memorizzati solo in memoria e cancellati al riavvio. - Priorità della whitelist. Gli IP in whitelist bypassano tutti i controlli, incluso il filtraggio a livello di messaggio. Usala con attenzione.
- RegisterFailedAttempt. Il modulo brute force richiede che tu chiami
RegisterFailedAttemptdal tuo handler di autenticazione. Tutto il resto è automatico. - Database GeoIP. Carica un database CSV con
LoadGeoIPDatabaseper la risoluzione dei paesi, oppure implementa l'eventoOnResolveCountryper una logica di lookup personalizzata. - Decadimento del threat score. I punteggi diminuiscono automaticamente nel tempo. Regola
DecayPerHourper adattarlo ai tuoi pattern di traffico: i server ad alto traffico possono trarre beneficio da un decadimento più rapido per evitare falsi positivi. - Disponibilità per edizione. Il componente firewall è disponibile nelle edizioni Professional, Enterprise e All-Access di sgcWebSockets.
