Firewall pour les serveurs sgcWebSockets

· Composants

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 :

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 :

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 :

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 :

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 :

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