TsgcWebSocketFirewall implementa un componente firewall completo che protegge i server WebSocket da un'ampia gamma di minacce alla sicurezza.
TsgcWebSocketFirewall implementa un componente firewall completo che protegge i server WebSocket da un'ampia gamma di minacce alla sicurezza. Fornisce sedici moduli di protezione tra cui filtro blacklist/whitelist degli IP, protezione contro la forza bruta con ban automatico degli IP, rilevamento di SQL injection, rilevamento XSS (Cross-Site Scripting), limitazione della velocità delle connessioni, protezione contro il flood di messaggi, filtro GeoIP basato sul paese, rilevamento dei bot basato su IP, punteggio dinamico delle minacce, rilevamento di path traversal, rilevamento di command injection, limitazione della dimensione del payload, protezioni specifiche per WebSocket (convalida dell'origine, limiti di dimensione dei frame, filtro dei subprotocolli), escalation progressiva del ban, un motore di regole personalizzate e statistiche in tempo reale.
Il firewall si integra automaticamente con i componenti server tramite la proprietà Firewall disponibile su TsgcWebSocketServer, TsgcWebSocketHTTPServer e TsgcWebSocketServer_HTTPAPI. Una volta assegnato e configurato, intercetta connessioni e messaggi senza richiedere alcun collegamento manuale di eventi.
1. Rilasciare un componente TsgcWebSocketFirewall sul form.
2. Configurare i moduli di protezione desiderati:
Blacklist: Impostare Enabled a True e aggiungere IP o intervalli CIDR alla lista IPs (es. "10.0.0.0/8", "192.168.1.100").
Whitelist: Imposti Enabled su True e aggiunga gli IP attendibili. Gli IP in whitelist ignorano tutti gli altri controlli.
BruteForce: Impostare Enabled su True. Configurare MaxAttempts (predefinito 5), TimeWindowSec (predefinito 60) e BanDurationSec (predefinito 300).
SQLInjection: impostare Enabled su True. Rileva i pattern comuni di SQL injection nei messaggi.
XSS: Impostare Enabled su True. Rileva i pattern di cross-site scripting nei messaggi.
RateLimit: Impostare Enabled su True. Limita le connessioni simultanee per IP (predefinito 10 ogni 60 secondi).
FloodProtection: Imposti Enabled su True. Limita i messaggi al secondo per IP (predefinito 100).
PayloadLimit: Impostare Enabled su True. Blocca i messaggi che superano MaxSizeBytes (predefinito 1 MB).
PathTraversal: Impostare Enabled su True. Rileva i pattern di directory traversal.
CommandInjection: Impostare Enabled su True. Rileva i pattern di iniezione di comandi shell.
ThreatScore: Impostare Enabled su True. Assegna punteggi dinamici agli IP in base alle violazioni.
BanEscalation: Impostare Enabled su True. Aumenta progressivamente la durata dei ban per i trasgressori recidivi.
GeoIP: Imposti Enabled su True. Blocca o consente le connessioni in base al codice paese.
BotDetection: Imposti Enabled su True. Classifica gli IP in connessione come crawler verificati, host di datacenter, bot sospetti, in blocklist o umani.
WebSocketProtection: Impostare Enabled a True. Convalida origini, dimensioni dei frame e sottoprotocolli.
CustomRules: Impostare Enabled su True. Motore di regole configurabile per filtraggio complesso.
3. Assegni il firewall a un componente server:
sgcWebSocketHTTPServer1.Firewall := sgcWebSocketFirewall1;
4. Avviare il server. Il firewall protegge automaticamente tutte le connessioni e i messaggi.
| Proprietà | Descrizione |
| Abilitato | Abilita o disabilita il firewall. Predefinito: True. |
| Blacklist | Configurazione della blacklist IP. Contiene le proprietà Enabled (Boolean) e IPs (TStringList). Supporta IP esatti e notazione CIDR (ad es. "192.168.0.0/16"). |
| Whitelist | Configurazione della lista bianca degli IP. Gli IP nella lista bianca bypassano tutti i controlli di sicurezza. Stessa struttura della Blacklist. |
| BruteForce | Protezione contro la forza bruta. Proprietà: Enabled, MaxAttempts (predefinito 5), TimeWindowSec (predefinito 60), BanDurationSec (predefinito 300). Vieta automaticamente gli indirizzi IP che superano il limite di tentativi. |
| SQLInjection | Rilevamento di SQL injection. Proprietà: Enabled, Action (faDeny/faAllow/faLog), CustomPatterns (TStringList per pattern aggiuntivi). |
| XSS | Rilevamento cross-site scripting. Proprietà: Enabled, Action (faDeny/faAllow/faLog). |
| RateLimit | Rate limiting delle connessioni. Proprietà: Enabled, MaxConnectionsPerIP (predefinito 10), TimeWindowSec (predefinito 60). |
| FloodProtection | Protezione contro il flood di messaggi. Proprietà: Enabled, MaxMessagesPerSec (predefinito 100), Action (faDeny/faAllow/faLog). |
| PayloadLimit | Limitazione della dimensione dei messaggi. Proprietà: Enabled, MaxSizeBytes (predefinito 1048576), Action (faDeny/faAllow/faLog). |
| PathTraversal | Rilevamento del path traversal. Proprietà: Enabled, Action (faDeny/faAllow/faLog). |
| CommandInjection | Rilevamento di command injection. Proprietà: Enabled, Action (faDeny/faAllow/faLog), CustomPatterns (TStringList per pattern aggiuntivi). |
| ThreatScore | Punteggio dinamico delle minacce. Proprietà: Enabled, AutoBanThreshold (predefinito 80), DecayPerHour (predefinito 5), più pesi per tipo di violazione per ottimizzare il calcolo del punteggio. |
| BanEscalation | Escalation progressiva del ban. Proprietà: Enabled, Levels (TStringList di durate in secondi), ResetAfterSec (predefinito 86400). Ogni ban successivo utilizza la durata del livello successivo. Un valore di livello pari a 0 equivale a un ban permanente. |
| GeoIP | Filtraggio geografico degli IP. Proprietà: Enabled, Mode (gmBlockList/gmAllowList), Countries (TStringList di codici paese ISO 3166-1 alpha-2), DatabaseFile (percorso di un database CSV GeoIP). |
| BotDetection | Rilevamento dei bot basato su IP. Proprietà: Enabled, KnownBotsFile, CacheDurationSec (predefinito 3600), DNSTimeoutMS (predefinito 2000), più i sotto-oggetti ReverseDNS, Datacenter e DNSBL. Solo classificazione: classifica gli IP come crawler verificati, host di datacenter, bot sospetti, in blocklist o umani senza bloccare. |
| WebSocketProtection | Protezioni specifiche per WebSocket. Proprietà: Enabled, AllowedOrigins (TStringList), MaxFrameSize (Integer), AllowedSubprotocols (TStringList). |
| CustomRules | Motore di regole personalizzato. Proprietà: Enabled, Rules (TCollection di TsgcFirewallRuleItem). Ogni regola definisce condizioni e azioni per logiche di filtraggio complesse. |
OnFiltered: Si attiva quando una connessione o un messaggio viene bloccato. Il parametro Allow (var Boolean) Le consente di sovrascrivere la decisione del firewall.
OnViolation: Attivato quando viene rilevata una violazione di sicurezza. Fornisce l'indirizzo IP, il tipo di violazione e i dettagli a scopo di logging.
OnResolveCountry: Generato quando GeoIP deve risolvere un IP in un codice paese. Assegnare un gestore per fornire una risoluzione paese personalizzata oppure caricare un file di database GeoIP per lookup automatici.
OnBotDetected: Si attiva quando il rilevamento dei bot classifica un IP. Fornisce l'indirizzo IP, il verdetto TsgcBotClassification e il nome del bot corrispondente per la registrazione o l'analisi.
OnResolveBot: Si attiva quando il rilevamento dei bot deve classificare un IP. Assegni un gestore per fornire un verdetto personalizzato al posto del resolver integrato.
OnThreatScoreChanged: Generato quando il punteggio di minaccia di un IP cambia. Fornisce l'indirizzo IP insieme ai valori del punteggio vecchio e nuovo.
| Metodo | Descrizione |
| IsConnectionAllowed(IP) | Verifica se una connessione dall'IP specificato è consentita. Viene chiamato automaticamente quando integrato con un server. |
| IsMessageAllowed(IP, Message) | Verifica se un messaggio proveniente dall'IP specificato supera tutti i filtri messaggi. Chiamato automaticamente quando integrato con un server. |
| RegisterConnection(IP) | Registra una nuova connessione per il monitoraggio della limitazione della velocità. Viene chiamato automaticamente. |
| UnregisterConnection(IP) | Rimuove una connessione dal tracciamento. Chiamato automaticamente alla disconnessione. |
| RegisterFailedAttempt(IP) | Registra un tentativo di autenticazione fallito per il rilevamento di attacchi a forza bruta. Chiamare questo metodo dall'handler dell'evento OnAuthentication quando l'autenticazione fallisce. |
| BanIP(IP, DurationSec) | Banna manualmente un indirizzo IP. DurationSec = 0 significa ban permanente. |
| UnbanIP(IP) | Rimuove un ban dall'indirizzo IP specificato. |
| IsBanned(IP) | Restituisce True se l'IP specificato è attualmente bannato. |
| ClearBans | Rimuove tutti i ban attivi. |
| ClearTracking | Reimposta tutti i dati di tracciamento interni (conteggi connessioni, log dei tentativi, conteggi messaggi). |
| SaveBansToFile(FileName) | Salva tutti i ban attivi in un file per la persistenza tra i riavvii. |
| LoadBansFromFile(FileName) | Ripristina i ban da un file precedentemente salvato. |
| LoadGeoIPDatabase(FileName) | Carica un database GeoIP in formato CSV. Formato atteso: start_ip,end_ip,country_code. |
| LookupCountry(IP) | Restituisce il codice paese ISO a 2 lettere per un indirizzo IP. |
| GetBotClassification(IP) | Restituisce il TsgcBotClassification per un indirizzo IP (privilegiando la cache; un cache miss può restituire bcUnknown e attivare una ricerca asincrona). |
| GetThreatScore(IP) | Restituisce il punteggio di minaccia corrente (0-100) per un indirizzo IP. |
| ResetThreatScore(IP) | Reimposta il punteggio di minaccia di un IP a 0. |
| GetTopThreats(Count) | Restituisce un elenco di IP con i punteggi di minaccia più elevati. |
| IsOriginAllowed(Origin) | Verifica se un header WebSocket Origin è consentito dalla configurazione WebSocketProtection. |
| IsFrameSizeAllowed(Size) | Verifica che la dimensione di un messaggio rientri nei limiti definiti da WebSocketProtection.MaxFrameSize. |
| IsSubprotocolAllowed(Subprotocol) | Verifica se un sottoprotocollo WebSocket è consentito dalla configurazione WebSocketProtection. |
| Statistiche | Oggetto TsgcFirewallStats pubblico di sola lettura con contatori in tempo reale per connessioni bloccate, messaggi filtrati, ban emessi, punteggi di minaccia e conteggi di hit per modulo. |
Quando assegnato alla proprietà Firewall di un server, il componente automaticamente:
La blacklist e la whitelist supportano la notazione CIDR per gli intervalli IP:
// Configure firewall
sgcWebSocketFirewall1.Blacklist.Enabled := True;
sgcWebSocketFirewall1.Blacklist.IPs.Add('10.0.0.0/8');
sgcWebSocketFirewall1.Whitelist.Enabled := True;
sgcWebSocketFirewall1.Whitelist.IPs.Add('192.168.1.1');
sgcWebSocketFirewall1.BruteForce.Enabled := True;
sgcWebSocketFirewall1.BruteForce.MaxAttempts := 3;
sgcWebSocketFirewall1.BruteForce.BanDurationSec := 600;
sgcWebSocketFirewall1.SQLInjection.Enabled := True;
sgcWebSocketFirewall1.XSS.Enabled := True;
sgcWebSocketFirewall1.RateLimit.Enabled := True;
sgcWebSocketFirewall1.RateLimit.MaxConnectionsPerIP := 5;
sgcWebSocketFirewall1.FloodProtection.Enabled := True;
// GeoIP: block connections from specific countries
sgcWebSocketFirewall1.GeoIP.Enabled := True;
sgcWebSocketFirewall1.GeoIP.Mode := gmBlockList;
sgcWebSocketFirewall1.GeoIP.Countries.Add('CN');
sgcWebSocketFirewall1.GeoIP.Countries.Add('RU');
sgcWebSocketFirewall1.LoadGeoIPDatabase('geoip.csv');
// Threat scoring with auto-ban
sgcWebSocketFirewall1.ThreatScore.Enabled := True;
sgcWebSocketFirewall1.ThreatScore.AutoBanThreshold := 80;
// Progressive ban escalation (5min, 30min, 2hr, 24hr, permanent)
sgcWebSocketFirewall1.BanEscalation.Enabled := True;
sgcWebSocketFirewall1.BanEscalation.Levels.Add('300');
sgcWebSocketFirewall1.BanEscalation.Levels.Add('1800');
sgcWebSocketFirewall1.BanEscalation.Levels.Add('7200');
sgcWebSocketFirewall1.BanEscalation.Levels.Add('86400');
sgcWebSocketFirewall1.BanEscalation.Levels.Add('0');
// Additional content protection
sgcWebSocketFirewall1.PayloadLimit.Enabled := True;
sgcWebSocketFirewall1.PayloadLimit.MaxSizeBytes := 65536;
sgcWebSocketFirewall1.PathTraversal.Enabled := True;
sgcWebSocketFirewall1.CommandInjection.Enabled := True;
// Persistent bans
sgcWebSocketFirewall1.SaveBansToFile('bans.dat');
sgcWebSocketFirewall1.LoadBansFromFile('bans.dat');
// Assign to server
sgcWebSocketHTTPServer1.Firewall := sgcWebSocketFirewall1;
// Optional: Track failed login attempts
procedure TForm1.ServerAuthentication(Connection: TsgcWSConnection;
aUser, aPassword: String; var Authenticated: Boolean);
begin
Authenticated := (aUser = 'admin') and (aPassword = 'secret');
if not Authenticated then
sgcWebSocketFirewall1.RegisterFailedAttempt(Connection.IP);
end;
// Optional: Handle firewall events for logging
procedure TForm1.FirewallViolation(Sender: TObject; const aIP: string;
const aViolationType: TsgcFirewallViolationType; const aDetails: string);
begin
Log('Firewall violation from ' + aIP + ': ' + aDetails);
end;
Il rilevatore di SQL injection integrato verifica i seguenti pattern (senza distinzione tra maiuscole e minuscole):
È possibile aggiungere ulteriori pattern personalizzati tramite la proprietà SQLInjection.CustomPatterns.
Il rilevatore di path traversal integrato verifica questi pattern:
Il rilevatore integrato di iniezione di comandi verifica i seguenti pattern:
È possibile aggiungere pattern personalizzati aggiuntivi tramite la proprietà CommandInjection.CustomPatterns.
Il componente firewall è completamente thread-safe. Tutti i metodi pubblici utilizzano sezioni critiche interne per proteggere l'accesso concorrente ai dati di tracciamento. È stato sottoposto a stress test con 20 thread concorrenti che eseguono 100.000 operazioni senza errori e senza perdite di memoria.
Il componente può essere condiviso in modo sicuro tra più istanze server e accessibile da qualsiasi thread (gestori di eventi server, thread timer, ecc.) senza sincronizzazione esterna.