“Posso identificar bots pelo IP?” é uma das perguntas mais comuns que recebemos sobre filtragem no lado do servidor. A resposta honesta é: o IP sozinho é um ponto de partida, não um veredito — mas combinado com alguns sinais bem escolhidos ele se torna confiável. O sgcWebSockets 2026.6 adiciona um novo módulo de Detecção de Bots ao componente TsgcWebSocketFirewall que faz exatamente isso, classificando cada IP que se conecta usando quatro sinais independentes.
A Detecção de Bots fica ao lado dos recursos de firewall que você já conhece — lista negra / lista branca, GeoIP, força bruta, limitação de taxa, pontuação de ameaças — e segue o mesmo design baseado em propriedades de componente. Este post mostra como ela funciona e como configurá-la.
Quatro sinais, uma classificação
O módulo avalia cada IP em relação a quatro sinais independentes e resolve um único valor TsgcBotClassification:
- Faixas de IP de bots conhecidos — compara o IP com faixas publicadas de crawlers (Googlebot, Bingbot, GPTBot, ClaudeBot…) carregadas de um arquivo CIDR. Uma correspondência significa um crawler genuíno e declarado.
- Detecção de datacenter / hospedagem — sinaliza IPs que pertencem a faixas de provedores de nuvem e VPS (AWS, Hetzner, OVH…). Usuários reais raramente se conectam a partir de ASNs de datacenter; tráfego automatizado faz isso com muita frequência.
- Reverse DNS confirmado (FCrDNS) — faz uma consulta PTR no IP e, em seguida, confirma o hostname resultante de volta para o mesmo IP. Esta é a única maneira confiável de distinguir um Googlebot real de qualquer coisa que apenas afirme ser um em um cabeçalho.
- Reputação DNSBL — consulta listas de bloqueio DNS (Spamhaus e outras) para IPs com histórico de abuso conhecido.
O resultado é um de seis valores:
TsgcBotClassification = (bcUnknown, bcVerifiedCrawler, bcDatacenter,
bcSuspectedBot, bcBlocklisted, bcHuman);
A detecção apenas por IP tem limites reais — endereços são compartilhados atrás de CGNAT, eles rotacionam e bots sofisticados se escondem dentro de pools de proxy residencial. Portanto, a Detecção de Bots foi criada para fornecer uma boa pontuação de primeira passagem, não uma verdade absoluta. É por isso que, por design, ela nunca bloqueia uma conexão por conta própria.
Habilitando a Detecção de Bots
Tudo fica sob a nova propriedade BotDetection. Ative os sinais que você deseja e aponte os baseados em arquivo para seus dados:
uses
sgcWebSocket_Server_Firewall;
var
oFirewall: TsgcWebSocketFirewall;
begin
oFirewall := TsgcWebSocketFirewall.Create(nil);
oFirewall.BotDetection.Enabled := True;
// 1. Verified crawler IP ranges (file lines: CIDR,botname)
oFirewall.BotDetection.KnownBotsFile := 'C:\firewall\known-bots.csv';
// 2. Datacenter / hosting ranges (file lines: CIDR,asn-name)
oFirewall.BotDetection.Datacenter.Enabled := True;
oFirewall.BotDetection.Datacenter.ASNFile := 'C:\firewall\datacenter-ranges.csv';
// 3. Forward-confirmed reverse DNS verification
oFirewall.BotDetection.ReverseDNS.Enabled := True;
// 4. DNSBL reputation lookups
oFirewall.BotDetection.DNSBL.Enabled := True;
oFirewall.BotDetection.DNSBL.Zones.Add('zen.spamhaus.org');
// Resolution tuning
oFirewall.BotDetection.CacheDurationSec := 3600; // cache a verdict for 1h
oFirewall.BotDetection.DNSTimeoutMS := 2000;
oServer.Firewall := oFirewall;
end;
Os dois sinais baseados em arquivo reutilizam o mesmo motor CIDR rápido, com busca binária, que alimenta o banco de dados GeoIP do firewall, de modo que mesmo listas de faixas grandes são resolvidas em microssegundos.
Reverse DNS e DNSBL nunca bloqueiam a thread de accept
Reverse DNS e DNSBL são consultas DNS ao vivo — executá-las inline na thread de aceitação de conexões seria uma negação de serviço autoinfligida. Em vez disso, a Detecção de Bots as resolve em uma thread de trabalho em segundo plano e serve cada classificação a partir de um cache. Em uma falha de cache, o IP é enfileirado para resolução e a chamada atual retorna bcUnknown imediatamente; quando a consulta termina, o cache é atualizado e o evento OnBotDetected é disparado. A propriedade CacheDurationSec controla por quanto tempo um veredito é reutilizado antes de o IP ser verificado novamente.
Apenas classificar: OnBotDetected
A Detecção de Bots é apenas de classificação. Ela nunca nega uma conexão por conta própria — ela dispara um evento, atualiza as estatísticas do firewall (um novo contador fvBot) e deixa a decisão de política para você. Isso impede que um crawler verificado classificado incorretamente seja descartado silenciosamente.
procedure TForm1.FirewallBotDetected(Sender: TObject; const aIP: string;
aClassification: TsgcBotClassification; const aBotName: string);
begin
case aClassification of
bcVerifiedCrawler:
DoLog(aIP + ' is a verified crawler: ' + aBotName);
bcDatacenter:
DoLog(aIP + ' originates from a datacenter / hosting range');
bcBlocklisted:
DoLog(aIP + ' is listed on a DNSBL');
end;
end;
Você também pode solicitar um veredito a qualquer momento com GetBotClassification — útil para adaptar uma resposta em vez de filtrar uma conexão:
if oFirewall.GetBotClassification(vClientIP) = bcVerifiedCrawler then
// serve a lightweight, cache-friendly variant to the crawler
ServeStaticSnapshot
else
ServeFullApp;
Agindo sobre um veredito: o motor de Regras Personalizadas
Quando você de fato quer bloquear, você opta por isso explicitamente através do motor de Regras Personalizadas já existente no firewall. Cada TsgcFirewallRuleItem ganha uma nova propriedade BotType: defina-a, e a regra corresponde a conexões cuja classificação seja igual a esse valor. Você pode então negá-las, bani-las ou registrá-las — reutilizando toda a maquinaria de regras que você já tem.
var
oRule: TsgcFirewallRuleItem;
begin
oFirewall.CustomRules.Enabled := True;
// Ban any IP listed on a DNSBL for one hour
oRule := oFirewall.CustomRules.Rules.Add as TsgcFirewallRuleItem;
oRule.Name := 'ban-blocklisted-bots';
oRule.BotType := bcBlocklisted;
oRule.ActionType := raBan;
oRule.BanDurationSec := 3600;
end;
Essa separação — classificação passiva no módulo de Detecção de Bots, aplicação ativa apenas através de uma regra que você escreve — significa que o recurso nunca pode surpreendê-lo bloqueando tráfego que você queria manter.
Traga seu próprio veredito: OnResolveBot
Se você já executa um serviço de inteligência de ameaças, um cache de reputação interno ou um feed comercial de mitigação de bots, atribua o evento OnResolveBot. Quando ele está definido, seu manipulador fornece o veredito e as etapas do resolvedor interno são deixadas de lado — o mesmo padrão de substituição que o firewall já usa para o OnResolveCountry do GeoIP.
procedure TForm1.FirewallResolveBot(Sender: TObject; const aIP: string;
var aClassification: TsgcBotClassification; var aBotName: string);
begin
// Consult your own threat feed instead of the built-in resolver
if MyThreatFeed.IsMaliciousBot(aIP) then
begin
aClassification := bcBlocklisted;
aBotName := 'internal-threat-feed';
end;
end;
Demonstração
A demonstração do Firewall em Demos\04.WebSocket_Other_Samples\13.Firewall tem uma nova aba Bot Detection onde você pode ativar cada sinal, carregar os arquivos de faixas de bots conhecidos e de datacenter, configurar zonas DNSBL e usar um testador “Classify IP” ao vivo para ver o veredito de qualquer endereço — com cada classificação transmitida para o log de eventos.
Disponibilidade
A Detecção de Bots está presente no sgcWebSockets 2026.6 e é uma adição pronta para uso: a propriedade BotDetection vem desativada por padrão, portanto, projetos existentes não são afetados até que você a ative. O recurso está disponível para Delphi (7 a 13), C++Builder e a edição .NET.
Clientes com uma assinatura ativa podem baixar a nova versão na área do cliente. Usuários da versão de teste podem obter o instalador atualizado em esegece.com/products/websockets/download.
Dúvidas, comentários ou ajuda com a migração? Entre em contato — você receberá uma resposta das pessoas que escreveram o código.
