Firewall para Servidores sgcWebSockets

· Componentes

Segurança não é mais opcional. Todo servidor WebSocket exposto à internet é alvo de ataques de força bruta, tentativas de injeção, inundação de conexões e abuso automatizado. Defender-se dessas ameaças normalmente exige adicionar middleware externo, escrever lógica de filtragem personalizada ou implantar um reverse proxy separado — tudo isso adiciona complexidade e atrasa o desenvolvimento.

O sgcWebSockets 2026.4.0 apresenta o TsgcWSFirewall — um componente de firewall dedicado que se conecta diretamente ao seu servidor WebSocket, agora com 15 módulos de proteção incluindo filtragem geográfica GeoIP, pontuação adaptativa de ameaças, escalonamento progressivo de banimentos e um mecanismo de regras personalizadas. Solte o componente, configure os módulos de proteção necessários, atribua-o ao servidor e seu aplicativo estará protegido. Sem dependências externas. Sem middleware. Sem código personalizado para os casos comuns.

Este artigo cobre o conjunto completo de funcionalidades e mostra como configurar cada módulo de proteção em Delphi.

Quinze Módulos de Proteção, Um Componente

O firewall oferece quinze módulos de proteção independentes. Habilite apenas o que você precisa — cada módulo funciona sozinho ou em combinação com os outros.

Lista Negra de IPs
Bloqueie endereços IP específicos ou intervalos inteiros usando notação CIDR. Conexões de IPs na lista negra são rejeitadas antes de chegar ao código do seu aplicativo.
Lista Branca de IPs
Defina uma lista de IPs confiáveis. Quando habilitada, os endereços na lista branca ignoram todas as outras verificações de segurança — ideal para serviços internos e ferramentas de monitoramento.
Proteção contra Força Bruta
Rastreie tentativas de autenticação fracassadas por IP. Bane automaticamente os infratores após um limite configurável dentro de uma janela de tempo deslizante.
Detecção de SQL Injection
Analisa as mensagens recebidas em busca de padrões comuns de SQL injection. Detecção integrada para injeção booleana, UNION SELECT, injeção de instrução e mais.
Detecção de XSS
Detecta payloads de cross-site scripting em mensagens. Captura tags de script, manipuladores de eventos, URIs do protocolo JavaScript, injeção de iframe e expressões CSS.
Limitação de Taxa de Conexão
Limita o número de conexões simultâneas por endereço IP. Impede que um único cliente esgote os recursos do servidor.
Proteção contra Inundação de Mensagens
Limita o número de mensagens que um único IP pode enviar por segundo. Protege contra inundação de mensagens e padrões de negação de serviço.
Limitação de Tamanho de Payload
Rejeita mensagens que excedem um limite máximo de tamanho. Previne esgotamento de memória por payloads excessivamente grandes.
Detecção de Path Traversal
Detecta sequências de travessia de diretório em mensagens. Bloqueia tentativas de acessar arquivos fora do escopo pretendido.
Detecção de Injeção de Comandos
Detecta padrões de injeção de comandos do SO em mensagens. Bloqueia metacaracteres de shell e sequências de comandos comuns.
Filtragem Geográfica GeoIP
Permite ou bloqueia conexões com base na origem geográfica. Suporta modos de lista negra e lista branca com consulta a banco de dados CSV.
Sistema de Pontuação de Ameaças
Acumula pontuações ponderadas por IP em todos os tipos de violação. Bane automaticamente quando um limite é atingido, com decaimento automático ao longo do tempo.
Escalonamento Progressivo de Banimentos
Aumenta a duração do banimento a cada reincidência. Escala de banimentos curtos a bloqueios permanentes para infratores persistentes.
Proteção WebSocket
Valida origens WebSocket, aplica limites de tamanho de frame e filtra subprotocolos. Proteção no nível do protocolo, além do conteúdo das mensagens.
Mecanismo de Regras Personalizadas
Defina suas próprias regras de firewall com condições e ações. Crie limites de violação, janelas de tempo e respostas automatizadas.

Início Rápido

Colocar o firewall em funcionamento requer apenas três passos: criar, configurar e atribuir.

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;

Uma vez atribuído, o firewall integra automaticamente: as conexões são verificadas antes de chegarem aos seus manipuladores de eventos, as mensagens são analisadas em tempo real e os clientes desconectados são removidos do rastreamento — tudo sem escrever uma única linha de código de tratamento de eventos.

Lista Negra & Lista Branca de IPs

A lista negra rejeita conexões de IPs ou intervalos específicos. A lista branca faz o oposto — define um conjunto de endereços confiáveis que ignoram todas as outras verificações, incluindo a filtragem de mensagens.

Ambas suportam endereços IP exatos e notação CIDR para filtragem por intervalo:

// 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

Prioridade. Quando a lista branca está habilitada, ela é verificada primeiro. Se o IP corresponder, a conexão é permitida imediatamente — lista negra, banimentos, limites de taxa e filtros de mensagem são todos ignorados.

Proteção contra Força Bruta

O módulo de força bruta rastreia tentativas de autenticação fracassadas por IP usando uma janela de tempo deslizante. Quando um IP excede o número máximo de tentativas dentro da janela, ele é automaticamente banido por uma duração configurável.

Propriedade Padrão Descrição
MaxAttempts 5 Tentativas fracassadas antes do banimento
TimeWindowSec 60 Janela deslizante em segundos para contar tentativas
BanDurationSec 300 Duração do banimento em segundos (0 = permanente)
// 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;

O firewall cuida do resto automaticamente: conta as tentativas, verifica a janela de tempo e bane o IP quando o limite é atingido. IPs banidos são rejeitados no nível de conexão antes de qualquer processamento adicional.

Gerenciamento Manual de Banimentos

Além dos banimentos automáticos, você pode gerenciar banimentos programaticamente a qualquer momento:

// 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;

Detecção de SQL Injection

O módulo de SQL injection analisa cada mensagem de texto recebida em busca de padrões de ataque comuns. Quando uma correspondência é detectada, a ação configurável determina a resposta: bloquear o cliente, registrar o evento ou permitir a passagem.

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(');

Padrões Integrados

O detector inclui verificações sem distinção de maiúsculas e minúsculas para as técnicas de SQL injection mais comuns:

Detecção de XSS

O módulo XSS detecta payloads de cross-site scripting em mensagens WebSocket antes que possam chegar à lógica do seu aplicativo ou ser retransmitidas para outros clientes.

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

A detecção integrada cobre:

Limitação de Taxa de Conexão

Limita o número de conexões simultâneas que um único endereço IP pode manter. Isso previne o esgotamento de recursos causado por clientes que abrem conexões excessivas — sejam maliciosos ou mal configurados.

// Allow up to 5 concurrent connections per IP
oFirewall.RateLimit.Enabled := True;
oFirewall.RateLimit.MaxConnectionsPerIP := 5;
oFirewall.RateLimit.TimeWindowSec := 60;

O rastreamento de conexões é totalmente automático: o firewall incrementa o contador na conexão e o decrementa na desconexão. Quando uma nova conexão ultrapassaria o limite, ela é rejeitada antes que o evento OnConnect do servidor seja disparado.

Proteção contra Inundação de Mensagens

Limita o número de mensagens que um único IP pode enviar por segundo. Isso protege contra padrões de negação de serviço em que um cliente envia mensagens rapidamente para sobrecarregar o servidor ou outros clientes conectados.

// Limit to 50 messages per second per IP
oFirewall.FloodProtection.Enabled := True;
oFirewall.FloodProtection.MaxMessagesPerSec := 50;
oFirewall.FloodProtection.Action := faDeny;  // Disconnect offender

Limitação de Tamanho de Payload

Aplica um tamanho máximo de mensagem para impedir que clientes enviem payloads excessivamente grandes que poderiam esgotar a memória do servidor. Mensagens que excedem o limite são rejeitadas antes do processamento.

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

Detecção de Path Traversal

O módulo de path traversal analisa as mensagens recebidas em busca de sequências de travessia de diretório que tentam acessar arquivos fora do escopo pretendido. Isso é crítico para aplicativos que processam caminhos de arquivo ou identificadores de recurso provenientes de mensagens do cliente.

A detecção integrada cobre:

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

Detecção de Injeção de Comandos

O módulo de injeção de comandos detecta padrões de injeção de comandos do SO em mensagens. Captura metacaracteres de shell e sequências de comandos comuns usados para executar comandos arbitrários do sistema.

A detecção integrada cobre:

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

Filtragem Geográfica GeoIP

Filtra conexões com base na origem geográfica usando resolução de IP para país. O módulo GeoIP suporta dois modos: BlockList (bloquear países específicos, permitir todo o resto) e AllowList (permitir apenas países específicos, bloquear todo o resto).

Propriedade Descrição
Mode gmBlockList ou gmAllowList
Countries Códigos de país ISO 3166-1 alpha-2 (ex.: US, GB, DE)
DatabaseFile Caminho para o arquivo CSV de resolução IP para país

Bloquear Países Específicos

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

Permitir Apenas Países Específicos

// 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');

Bancos de dados GeoIP. Bancos de dados CSV gratuitos de IP para país estão disponíveis em provedores como DB-IP e IP2Location. Alternativamente, implemente o evento OnResolveCountry para usar sua própria lógica de resolução.

Sistema de Pontuação de Ameaças

O sistema de pontuação de ameaças atribui pontos ponderados a cada tipo de violação e acumula uma pontuação por endereço IP. Quando a pontuação excede o limite de banimento automático, o IP é automaticamente banido. As pontuações decaem ao longo do tempo, portanto incidentes isolados não resultam em penalidades permanentes.

Propriedade Padrão Descrição
AutoBanThreshold 100 Pontuação em que o IP é banido automaticamente
DecayPerHour 10 Pontos subtraídos por hora de inatividade
oFirewall.ThreatScore.Enabled := True;
oFirewall.ThreatScore.AutoBanThreshold := 80;
oFirewall.ThreatScore.DecayPerHour := 5;

Monitorando Mudanças de Pontuação

Use o evento OnThreatScoreChanged para monitorar pontuações em tempo real e tomar ações personalizadas antes que o limite de banimento automático seja atingido.

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;

Escalonamento Progressivo de Banimentos

Em vez de uma duração de banimento fixa, o módulo de escalonamento aumenta o tempo de banimento a cada reincidência. Infratores pela primeira vez recebem um banimento curto; infratores persistentes são escalados até um bloqueio permanente.

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

Dica. Combine o escalonamento progressivo com o sistema de pontuação de ameaças para máxima eficácia. A pontuação de ameaças identifica agentes maliciosos em múltiplos tipos de violação, e o escalonamento garante que infratores reincidentes enfrentem consequências cada vez mais severas.

Proteção Específica para WebSocket

Além da análise no nível de mensagem, o firewall oferece proteções no nível do protocolo específicas para conexões WebSocket: validação de origem, aplicação de limite de tamanho de frame e filtragem de subprotocolos.

// 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');

Mecanismo de Regras Personalizadas

O mecanismo de regras personalizadas permite definir suas próprias regras de firewall com condições e ações automatizadas. Cada regra especifica um limite de violações dentro de uma janela de tempo e a ação a ser tomada quando o limite é excedido.

Propriedade Descrição
Name Nome descritivo para a regra
MinViolations Número de violações necessárias para acionar a regra
TimeWindowSec Janela deslizante em segundos para contar violações
ActionType Ação a tomar: raDeny, raAllow, raBan ou raLog
BanDurationSec Duração do banimento quando ActionType é raBan

Tipos de ação:

Ação Comportamento
raDeny Desconecta o cliente imediatamente
raAllow Nenhuma ação (a regra é rastreada, mas não aplicada)
raBan Bane o IP pela duração especificada
raLog Dispara apenas o 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;

Estatísticas em Tempo Real

O firewall expõe um objeto Stats com contadores em tempo real de conexões ativas, total de tentativas bloqueadas e contagens por tipo de violação. Use-o para criar painéis de monitoramento ou registrar resumos periódicos.

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

Banimentos Persistentes

Por padrão, os banimentos são armazenados na memória e apagados ao reiniciar. Use SaveBansToFile e LoadBansFromFile para persistir os banimentos entre reinicializações do servidor.

// Save bans before shutdown
oFirewall.SaveBansToFile('bans.dat');
// Restore bans on startup
oFirewall.LoadBansFromFile('bans.dat');

Modos de Ação

Os módulos de SQL injection, XSS e proteção contra inundação suportam três ações configuráveis quando uma violação é detectada:

Ação Comportamento Caso de Uso
faDeny Bloqueia e desconecta o cliente Servidores em produção
faLog Dispara o evento OnViolation, mas permite a conexão Monitoramento, testes, implantação gradual
faAllow Nenhuma ação Desabilitar temporariamente um módulo sem remover a configuração

Dica. Comece com faLog em produção para observar como o firewall reage ao tráfego real antes de mudar para faDeny. Isso evita o bloqueio de usuários legítimos durante a implantação inicial.

Eventos — Registro & Substituições

Os eventos oferecem visibilidade total sobre as decisões do firewall e a capacidade de substituí-las quando necessário.

OnViolation — Registro de Segurança

Disparado em cada violação detectada. Use-o para escrever logs de segurança, enviar alertas ou alimentar um painel de monitoramento.

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;

Os tipos de violação incluem:

Tipo Disparado Quando
fvBlacklist O IP está na lista negra
fvBruteForce Limite de tentativas fracassadas excedido
fvRateLimit Limite de taxa de conexão excedido
fvFlood Inundação de mensagens detectada
fvSQLInjection Padrão de SQL injection detectado
fvXSS Padrão de XSS detectado
fvGeoIP Conexão bloqueada pelo filtro de país
fvPathTraversal Padrão de path traversal detectado
fvCommandInjection Padrão de injeção de comandos detectado
fvPayloadSize Mensagem excede o tamanho máximo de payload
fvOrigin Origem WebSocket não está na lista permitida
fvFrameSize Frame WebSocket excede o tamanho máximo
fvThreatScore Pontuação de ameaças excedeu o limite de banimento automático
fvCustomRule Limite de regra personalizada excedido

OnFiltered — Substituir Decisões

Disparado quando uma conexão ou mensagem está prestes a ser bloqueada. O parâmetro Allow permite substituir a decisão do firewall em tempo de execução.

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 — Resolução GeoIP Personalizada

Disparado quando o módulo GeoIP precisa resolver um endereço IP para um código de país. Use isso para implementar sua própria lógica de resolução em vez do (ou em complemento ao) banco de dados CSV integrado.

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

OnThreatScoreChanged — Monitoramento de Pontuação

Disparado sempre que a pontuação de ameaças de um IP muda. Use isso para implementar limites personalizados, alertas ou respostas graduadas antes que o limite de banimento automático seja atingido.

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;

Integração com o Servidor

O firewall funciona com todos os três componentes de servidor. Uma única instância do firewall pode até ser compartilhada entre múltiplos servidores.

Componente Descrição
TsgcWebSocketHTTPServer Servidor WebSocket + HTTP (baseado em Indy)
TsgcWebSocketServer Servidor WebSocket puro (Indy TCP)
TsgcWebSocketServer_HTTPAPI Servidor WebSocket usando driver de kernel HTTP.SYS

A integração é automática após a atribuição. O firewall intercepta em três pontos:

Exemplo Completo

Um servidor WebSocket totalmente configurado com os módulos de proteção principais e os novos recursos avançados habilitados.

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;

Thread Safety

O componente firewall é totalmente thread-safe. Todos os métodos públicos usam seções críticas internas para proteger o acesso concorrente aos dados de rastreamento. Foi testado sob estresse com 20 threads concorrentes realizando 100.000 operações com zero erros e zero vazamentos de memória.

O componente pode ser compartilhado com segurança entre múltiplas instâncias de servidor e acessado de qualquer thread — manipuladores de eventos do servidor, threads de timer, workers em background — sem sincronização externa.

Notas Importantes