La sécurité n'est plus optionnelle. Chaque serveur WebSocket exposé sur Internet est une cible pour les attaques par force brute, les tentatives d'injection, le flood de connexions et les abus automatisés. Se défendre contre ces menaces nécessite généralement d'ajouter du middleware externe, d'écrire de la logique de filtrage personnalisée ou de déployer un reverse proxy séparé — tout cela ajoute de la complexité et ralentit le développement.
sgcWebSockets 2026.4.0 introduit TsgcWSFirewall — un composant firewall dédié qui se branche directement sur ton serveur WebSocket, désormais avec 15 modules de protection incluant le filtrage par pays GeoIP, le scoring de menaces adaptatif, l'escalade progressive des bannissements et un moteur de règles personnalisées. Pose le composant, configure les modules de protection dont tu as besoin, assigne-le au serveur et ton application est protégée. Pas de dépendances externes. Pas de middleware. Pas de code personnalisé pour les cas courants.
Cet article couvre l'ensemble des fonctionnalités et montre comment configurer chaque module de protection en Delphi.
Quinze modules de protection, un seul composant
Le firewall fournit quinze modules de protection indépendants. Active uniquement ce dont tu as besoin — chaque module fonctionne seul ou en combinaison avec les autres.
|
Liste noire d'IP Bloque des adresses IP spécifiques ou des plages entières en notation CIDR. Les connexions depuis les IP en liste noire sont rejetées avant d'atteindre le code de ton application. |
Liste blanche d'IP Définis une liste d'IP de confiance. Quand activée, les adresses en liste blanche contournent toutes les autres vérifications de sécurité — idéal pour les services internes et les outils de monitoring. |
Protection force brute Suit les tentatives d'authentification échouées par IP. Bannit automatiquement les contrevenants après un seuil configurable dans une fenêtre temporelle glissante. |
|
Détection d'injection SQL Analyse les messages entrants pour détecter les motifs courants d'injection SQL. Détection intégrée pour l'injection booléenne, UNION SELECT, l'injection d'instructions et plus. |
Détection XSS Détecte les charges utiles de cross-site scripting dans les messages. Attrape les balises script, les gestionnaires d'événements, les URI de protocole JavaScript, l'injection d'iframe et les expressions CSS. |
Limitation du taux de connexion Limite le nombre de connexions simultanées par adresse IP. Empêche un seul client d'épuiser les ressources du serveur. |
|
Protection contre le flood de messages Limite le nombre de messages qu'une seule IP peut envoyer par seconde. Protège contre le flood de messages et les schémas de déni de service. |
Limitation de la taille de charge utile Rejette les messages qui dépassent un seuil de taille maximal. Empêche l'épuisement de la mémoire dû à des charges utiles surdimensionnées. |
Détection de traversée de répertoire Détecte les séquences de traversée de répertoire dans les messages. Bloque les tentatives d'accès à des fichiers hors du périmètre prévu. |
|
Détection d'injection de commandes Détecte les motifs d'injection de commandes OS dans les messages. Bloque les métacaractères shell et les séquences de commandes courantes. |
Filtrage par pays GeoIP Autorise ou bloque les connexions selon l'origine géographique. Prend en charge les modes liste de blocage et liste d'autorisation avec recherche dans une base CSV. |
Système de score de menace Accumule des scores pondérés par IP sur tous les types de violation. Bannissement automatique quand un seuil est atteint, avec décroissance automatique dans le temps. |
|
Escalade progressive de bannissement Augmente la durée de bannissement à chaque récidive. Escalade de bannissements courts à des blocages permanents pour les contrevenants persistants. |
Protection WebSocket Valide les origines WebSocket, applique des limites de taille de trame et filtre les sous-protocoles. Protection au niveau du protocole au-delà du contenu des messages. |
Moteur de règles personnalisées Définis tes propres règles de firewall avec conditions et actions. Crée des seuils de violation, fenêtres temporelles et réponses automatisées. |
Démarrage rapide
Mettre le firewall en service ne demande que trois étapes : créer, configurer et assigner.
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;
Une fois assigné, le firewall s'intègre automatiquement : les connexions sont vérifiées avant d'atteindre tes gestionnaires d'événements, les messages sont analysés en temps réel et les clients déconnectés sont désinscrits du suivi — le tout sans écrire une seule ligne de code de gestion d'événements.
Liste noire et liste blanche d'IP
La liste noire rejette les connexions depuis des IP ou plages spécifiques. La liste blanche fait l'inverse — elle définit un ensemble d'adresses de confiance qui contournent toutes les autres vérifications, y compris le filtrage des messages.
Les deux prennent en charge les adresses IP exactes et la notation CIDR pour le filtrage par plage :
// 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
Priorité. Quand la liste blanche est activée, elle est vérifiée en premier. Si l'IP correspond, la connexion est autorisée immédiatement — liste noire, bannissements, limites de débit et filtres de messages sont tous ignorés.
Protection force brute
Le module de force brute suit les tentatives d'authentification échouées par IP via une fenêtre temporelle glissante. Quand une IP dépasse le nombre maximal de tentatives dans la fenêtre, elle est automatiquement bannie pour une durée configurable.
| Propriété | Défaut | Description |
|---|---|---|
| MaxAttempts | 5 | Tentatives échouées avant bannissement |
| TimeWindowSec | 60 | Fenêtre glissante en secondes pour compter les tentatives |
| BanDurationSec | 300 | Durée de bannissement en secondes (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;
Le firewall gère automatiquement le reste : il compte les tentatives, vérifie la fenêtre temporelle et bannit l'IP quand le seuil est atteint. Les IP bannies sont rejetées au niveau de la connexion avant tout traitement ultérieur.
Gestion manuelle des bannissements
Au-delà des bannissements automatiques, tu peux gérer les bannissements par programme à tout moment :
// 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;
Détection d'injection SQL
Le module d'injection SQL analyse chaque message texte entrant à la recherche de motifs d'attaque courants. Quand une correspondance est détectée, l'action configurable détermine la réponse : bloquer le client, journaliser l'événement ou laisser passer.
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(');
Motifs intégrés
Le détecteur inclut des vérifications insensibles à la casse pour les techniques d'injection SQL les plus courantes :
- ' OR ', ' AND ' — Boolean injection
- UNION SELECT — Union-based injection
- '; DROP, '; DELETE, '; INSERT, '; UPDATE — Statement injection
- EXEC(, EXECUTE( — Command execution
- xp_cmdshell — Extended stored procedures
- CAST(, CONVERT( — Type conversion abuse
- 1=1, 1'='1 — Tautology injection
Détection XSS
Le module XSS détecte les charges utiles de cross-site scripting dans les messages WebSocket avant qu'elles ne puissent atteindre ta logique applicative ou être relayées à d'autres clients.
oFirewall.XSS.Enabled := True;
oFirewall.XSS.Action := faDeny;
La détection intégrée couvre :
- , <strong style="color:#2c2c2c;">javascript: — Script injection
- onerror=, onload=, onclick=, onmouseover= — Event handler injection
- eval(, document.cookie — JavaScript evaluation and cookie theft
- — Element injection
- , expression( — SVG and CSS expression attacks
Limitation du taux de connexion
Limite le nombre de connexions simultanées qu'une seule adresse IP peut maintenir. Cela empêche l'épuisement des ressources par des clients qui ouvrent un nombre excessif de connexions — qu'ils soient malveillants ou mal configurés.
// Allow up to 5 concurrent connections per IP
oFirewall.RateLimit.Enabled := True;
oFirewall.RateLimit.MaxConnectionsPerIP := 5;
oFirewall.RateLimit.TimeWindowSec := 60;
Le suivi des connexions est entièrement automatique : le firewall incrémente le compteur à la connexion et le décrémente à la déconnexion. Quand une nouvelle connexion dépasserait la limite, elle est rejetée avant que l'événement OnConnect du serveur ne soit déclenché.
Protection contre le flood de messages
Limite le nombre de messages qu'une seule IP peut envoyer par seconde. Cela protège contre les schémas de déni de service où un client envoie rapidement des messages pour submerger le serveur ou les autres clients connectés.
// Limit to 50 messages per second per IP
oFirewall.FloodProtection.Enabled := True;
oFirewall.FloodProtection.MaxMessagesPerSec := 50;
oFirewall.FloodProtection.Action := faDeny; // Disconnect offender
Limitation de la taille de charge utile
Applique une taille de message maximale pour empêcher les clients d'envoyer des charges utiles surdimensionnées qui pourraient épuiser la mémoire du serveur. Les messages dépassant le seuil sont rejetés avant traitement.
oFirewall.PayloadLimit.Enabled := True;
oFirewall.PayloadLimit.MaxSizeBytes := 65536; // 64 KB max
oFirewall.PayloadLimit.Action := faDeny;
Détection de traversée de répertoire
Le module de traversée de répertoire analyse les messages entrants à la recherche de séquences de traversée de répertoire qui tentent d'accéder à des fichiers hors du périmètre prévu. C'est crucial pour les applications qui traitent des chemins de fichiers ou des identifiants de ressources depuis les messages clients.
La détection intégrée couvre :
- ../, ..\ — Relative path traversal
- %2e%2e, %252e — URL-encoded traversal
- /etc/passwd, /etc/shadow — Unix system file access
- cmd.exe, boot.ini — Windows system file access
oFirewall.PathTraversal.Enabled := True;
oFirewall.PathTraversal.Action := faDeny;
Détection d'injection de commandes
Le module d'injection de commandes détecte les motifs d'injection de commandes OS dans les messages. Il attrape les métacaractères shell et les séquences de commandes courantes utilisées pour exécuter des commandes système arbitraires.
La détection intégrée couvre :
- ; |, &&, || — Shell command chaining
- $(command), `command` — Command substitution
- wget, curl, nc, netcat — Network utility invocation
- /bin/sh, /bin/bash, cmd /c — Shell spawning
oFirewall.CommandInjection.Enabled := True;
oFirewall.CommandInjection.Action := faDeny;
Filtrage par pays GeoIP
Filtre les connexions selon leur origine géographique via la résolution IP-vers-pays. Le module GeoIP prend en charge deux modes : BlockList (bloque des pays spécifiques, autorise tout le reste) et AllowList (autorise uniquement des pays spécifiques, bloque tout le reste).
| Property | Description |
|---|---|
| Mode | gmBlockList or gmAllowList |
| Countries | ISO 3166-1 alpha-2 country codes (e.g., US, GB, DE) |
| DatabaseFile | Path to CSV file for IP-to-country resolution |
Bloquer des pays spécifiques
oFirewall.GeoIP.Enabled := True;
oFirewall.GeoIP.Mode := gmBlockList;
oFirewall.GeoIP.Countries.Add('CN');
oFirewall.GeoIP.Countries.Add('RU');
oFirewall.LoadGeoIPDatabase('geoip.csv');
Autoriser uniquement des pays spécifiques
// 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');
Bases de données GeoIP. Des bases de données CSV IP-vers-pays gratuites sont disponibles auprès de fournisseurs comme DB-IP et IP2Location. Alternativement, implémente l'événement OnResolveCountry pour utiliser ta propre logique de résolution.
Système de score de menace
Le système de score de menace attribue des points pondérés à chaque type de violation et accumule un score par adresse IP. Quand le score dépasse le seuil d'auto-bannissement, l'IP est automatiquement bannie. Les scores décroissent dans le temps, donc les incidents ponctuels n'entraînent pas de pénalités permanentes.
| Propriété | Défaut | Description |
|---|---|---|
| AutoBanThreshold | 100 | Score à partir duquel l'IP est automatiquement bannie |
| DecayPerHour | 10 | Points soustraits par heure d'inactivité |
oFirewall.ThreatScore.Enabled := True;
oFirewall.ThreatScore.AutoBanThreshold := 80;
oFirewall.ThreatScore.DecayPerHour := 5;
Surveiller les changements de score
Utilise l'événement OnThreatScoreChanged pour surveiller les scores en temps réel et prendre une action personnalisée avant que le seuil d'auto-bannissement ne soit atteint.
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;
Escalade progressive de bannissement
Au lieu d'une durée de bannissement fixe, le module d'escalade augmente la durée du bannissement à chaque récidive. Les contrevenants pour la première fois reçoivent un bannissement court ; les contrevenants persistants sont escaladés jusqu'à un blocage permanent.
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
Astuce. Combine l'escalade progressive avec le système de score de menace pour une efficacité maximale. Le score de menace identifie les mauvais acteurs sur plusieurs types de violation et l'escalade garantit que les récidivistes font face à des conséquences de plus en plus sévères.
Protection spécifique à WebSocket
Au-delà de l'analyse au niveau des messages, le firewall fournit des protections au niveau du protocole spécifiques aux connexions WebSocket : validation de l'origine, application des limites de taille de trame et filtrage des sous-protocoles.
// 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');
Moteur de règles personnalisées
Le moteur de règles personnalisées te permet de définir tes propres règles de firewall avec conditions et actions automatisées. Chaque règle spécifie un seuil de violation dans une fenêtre temporelle et l'action à prendre quand le seuil est dépassé.
| Property | Description |
|---|---|
| Name | Nom descriptif de la règle |
| MinViolations | Nombre de violations requis pour déclencher la règle |
| TimeWindowSec | Fenêtre glissante en secondes pour compter les violations |
| ActionType | Action à prendre : raDeny, raAllow, raBan ou raLog |
| BanDurationSec | Durée de bannissement quand ActionType est raBan |
Types d'actions :
| Action | Comportement |
|---|---|
raDeny |
Déconnecte le client immédiatement |
raAllow |
Aucune action (la règle est suivie mais pas appliquée) |
raBan |
Bannit l'IP pour la durée spécifiée |
raLog |
Déclenche uniquement l'événement 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;
Statistiques en temps réel
Le firewall expose un objet Stats avec des compteurs en temps réel pour les connexions actives, le total des tentatives bloquées et les comptes par type de violation. Utilise-le pour construire des tableaux de bord de monitoring ou journaliser des résumés périodiques.
WriteLn('Active: ', oFirewall.Stats.ActiveConnections);
WriteLn('Blocked: ', oFirewall.Stats.TotalBlocked);
WriteLn('SQL Injection: ', oFirewall.Stats.GetViolationCount(fvSQLInjection));
Bannissements persistants
Par défaut, les bannissements sont stockés en mémoire et effacés au redémarrage. Utilise SaveBansToFile et LoadBansFromFile pour persister les bannissements entre les redémarrages du serveur.
// Save bans before shutdown
oFirewall.SaveBansToFile('bans.dat');
// Restore bans on startup
oFirewall.LoadBansFromFile('bans.dat');
Modes d'action
Les modules d'injection SQL, XSS et de protection contre le flood prennent en charge trois actions configurables quand une violation est détectée :
| Action | Comportement | Use Case |
|---|---|---|
faDeny |
Bloque et déconnecte le client | Serveurs de production |
faLog |
Déclenche l'événement OnViolation mais autorise la connexion | Monitoring, tests, déploiement progressif |
faAllow |
Aucune action | Désactiver temporairement un module sans supprimer la config |
Astuce. Commence par faLog en production pour observer comment le firewall réagit à ton trafic réel avant de passer à faDeny. Cela évite de bloquer des utilisateurs légitimes lors du déploiement initial.
Événements — journalisation et overrides
Les événements te donnent une visibilité totale sur les décisions du firewall et la capacité de les surcharger quand nécessaire.
OnViolation — journalisation de sécurité
Déclenché à chaque violation détectée. Utilise-le pour écrire des journaux de sécurité, envoyer des alertes ou alimenter un tableau de bord de monitoring.
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;
Les types de violation incluent :
| Type | Déclenché quand |
|---|---|
fvBlacklist |
L'IP est dans la liste noire |
fvBruteForce |
Seuil de tentatives échouées dépassé |
fvRateLimit |
Limite de taux de connexion dépassée |
fvFlood |
Flood de messages détecté |
fvSQLInjection |
Motif d'injection SQL détecté |
fvXSS |
Motif XSS détecté |
fvGeoIP |
Connexion bloquée par le filtre par pays |
fvPathTraversal |
Motif de traversée de répertoire détecté |
fvCommandInjection |
Motif d'injection de commandes détecté |
fvPayloadSize |
Message dépasse la taille de charge utile maximale |
fvOrigin |
Origine WebSocket absente de la liste autorisée |
fvFrameSize |
Trame WebSocket dépasse la taille maximale |
fvThreatScore |
Score de menace a dépassé le seuil d'auto-bannissement |
fvCustomRule |
Seuil de règle personnalisée dépassé |
OnFiltered — surcharger les décisions
Déclenché quand une connexion ou un message est sur le point d'être bloqué. Le paramètre Allow te permet de surcharger la décision du firewall à l'exécution.
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 — résolution GeoIP personnalisée
Déclenché quand le module GeoIP doit résoudre une adresse IP en code pays. Utilise ceci pour implémenter ta propre logique de résolution au lieu de (ou en plus de) la base de données CSV intégrée.
procedure TForm1.FirewallResolveCountry(Sender: TObject;
const aIP: string; var aCountryCode: string);
begin
aCountryCode := MyGeoIPLookup(aIP);
end;
OnThreatScoreChanged — monitoring de scores
Déclenché chaque fois que le score de menace d'une IP change. Utilise ceci pour implémenter des seuils personnalisés, des alertes ou des réponses graduelles avant que le seuil d'auto-bannissement ne soit atteint.
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;
Intégration serveur
Le firewall fonctionne avec les trois composants serveur. Une seule instance de firewall peut même être partagée entre plusieurs serveurs.
| Component | Description |
|---|---|
TsgcWebSocketHTTPServer |
Serveur WebSocket + HTTP (basé sur Indy) |
TsgcWebSocketServer |
Serveur WebSocket pur (Indy TCP) |
TsgcWebSocketServer_HTTPAPI |
Serveur WebSocket utilisant le pilote noyau HTTP.SYS |
L'intégration est automatique une fois assignée. Le firewall intercepte à trois points :
- À la nouvelle connexion : vérifie la liste noire, la liste blanche, les bannissements, GeoIP, les limites de débit et l'origine WebSocket. Rejette avant l'événement OnConnect si bloqué.
- À la réception d'un message : vérifie l'injection SQL, XSS, l'injection de commandes, la traversée de répertoire, la taille de charge utile et les limites de flood. Déconnecte le client en cas de violation.
- À la déconnexion : désinscrit la connexion des compteurs de suivi internes.
Exemple complet
Un serveur WebSocket entièrement configuré avec les modules de protection essentiels et les nouvelles fonctionnalités avancées activées.
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;
Sécurité multi-thread
Le composant firewall est entièrement thread-safe. Toutes les méthodes publiques utilisent des sections critiques internes pour protéger l'accès concurrent aux données de suivi. Il a été testé en charge avec 20 threads concurrents effectuant 100 000 opérations sans aucune erreur ni fuite mémoire.
Le composant peut être partagé en toute sécurité entre plusieurs instances de serveur et accédé depuis n'importe quel thread — gestionnaires d'événements du serveur, threads de timer, workers d'arrière-plan — sans synchronisation externe.
Notes importantes
- Messages texte uniquement. La détection d'injection SQL et XSS analyse les messages texte. Les messages binaires ne sont pas analysés.
- Bannissements persistants. Utilise
SaveBansToFileetLoadBansFromFilepour persister les bannissements entre les redémarrages. Sans ces appels, les bannissements sont stockés en mémoire uniquement et effacés au redémarrage. - Priorité de la liste blanche. Les IP en liste blanche contournent toutes les vérifications, y compris le filtrage au niveau des messages. Utilise ceci avec précaution.
- RegisterFailedAttempt. Le module de force brute nécessite que tu appelles
RegisterFailedAttemptdepuis ton gestionnaire d'authentification. Tout le reste est automatique. - Base de données GeoIP. Charge une base CSV avec
LoadGeoIPDatabasepour la résolution par pays, ou implémente l'événementOnResolveCountrypour une logique de recherche personnalisée. - Décroissance du score de menace. Les scores diminuent automatiquement dans le temps. Ajuste
DecayPerHourpour correspondre à tes schémas de trafic — les serveurs à fort trafic peuvent bénéficier d'une décroissance plus rapide pour éviter les faux positifs. - Disponibilité d'édition. Le composant firewall est disponible dans les éditions Professional, Enterprise et All-Access de sgcWebSockets.
