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:
- ' OR ', ' AND ' — Injeção booleana
- UNION SELECT — Injeção baseada em union
- '; DROP, '; DELETE, '; INSERT, '; UPDATE — Injeção de instrução
- EXEC(, EXECUTE( — Execução de comandos
- xp_cmdshell — Stored procedures estendidas
- CAST(, CONVERT( — Abuso de conversão de tipos
- 1=1, 1'='1 — Injeção por tautologia
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:
- , <strong style="color:#2c2c2c;">javascript: — Injeção de script
- onerror=, onload=, onclick=, onmouseover= — Injeção de manipulador de eventos
- eval(, document.cookie — Avaliação JavaScript e roubo de cookies
- — Injeção de elementos
- , expression( — Ataques de expressão SVG e CSS
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:
- ../, ..\ — Travessia relativa de caminho
- %2e%2e, %252e — Travessia codificada em URL
- /etc/passwd, /etc/shadow — Acesso a arquivos de sistema Unix
- cmd.exe, boot.ini — Acesso a arquivos de sistema Windows
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:
- ; |, &&, || — Encadeamento de comandos shell
- $(command), `command` — Substituição de comandos
- wget, curl, nc, netcat — Invocação de utilitários de rede
- /bin/sh, /bin/bash, cmd /c — Geração de shell
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:
- Na nova conexão: Verifica lista negra, lista branca, banimentos, GeoIP, limites de taxa e origem WebSocket. Rejeita antes do evento OnConnect se bloqueado.
- Na mensagem recebida: Verifica SQL injection, XSS, injeção de comandos, path traversal, tamanho de payload e limites de inundação. Desconecta o cliente em caso de violação.
- Na desconexão: Remove o registro da conexão dos contadores de rastreamento internos.
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
- Apenas mensagens de texto. A detecção de SQL injection e XSS analisa mensagens de texto. Mensagens binárias não são analisadas.
- Banimentos persistentes. Use
SaveBansToFileeLoadBansFromFilepara persistir banimentos entre reinicializações do servidor. Sem essas chamadas, os banimentos são armazenados apenas na memória e apagados ao reiniciar. - Prioridade da lista branca. IPs na lista branca ignoram todas as verificações, incluindo a filtragem no nível de mensagem. Use com cuidado.
- RegisterFailedAttempt. O módulo de força bruta exige que você chame
RegisterFailedAttemptdo seu manipulador de autenticação. Todo o resto é automático. - Banco de dados GeoIP. Carregue um banco de dados CSV com
LoadGeoIPDatabasepara resolução de país, ou implemente o eventoOnResolveCountrypara lógica de consulta personalizada. - Decaimento da pontuação de ameaças. As pontuações diminuem automaticamente ao longo do tempo. Ajuste
DecayPerHourpara corresponder aos seus padrões de tráfego — servidores de alto tráfego podem se beneficiar de um decaimento mais rápido para evitar falsos positivos. - Disponibilidade por edição. O componente firewall está disponível nas edições Professional, Enterprise e All-Access do sgcWebSockets.
