12 de Outubro: Como o Nerd Cult Lidou com uma Tentativa de SQL Injection

12 de Outubro: Como o Nerd Cult Lidou com uma Tentativa de SQL Injection

Em 12 de outubro de 2026, o Nerd Cult recebeu mais de mil tentativas automatizadas de envio em poucas horas. O que parecia um pico de audiĂȘncia revelou uma sequĂȘncia de requisiçÔes com indĂ­cios de SQL Injection. Neste relato, explico o que observei, por que o acesso ao banco nĂŁo foi comprometido e quais medidas adotei depois.

No dia 12 de outubro, vi um nĂșmero de acessos ao Nerd Cult que, Ă  primeira vista, parecia uma Ăłtima notĂ­cia: mais de mil tentativas em poucas horas. O primeiro pensamento foi que o conteĂșdo finalmente estava chegando a mais leitores.

A anĂĄlise dos registros mudou essa impressĂŁo. Em vez de navegação normal, encontrei requisiçÔes concentradas em pontos que recebem texto, como o formulĂĄrio de contato e os comentĂĄrios. Parte dos valores enviados continha sequĂȘncias que pareciam tentar manipular consultas SQL.

Os registros mostravam automação e tentativas compatĂ­veis com SQL Injection. Isso, por si sĂł, nĂŁo comprova que os pedidos vieram de um botnet especĂ­fico; para afirmar isso seria necessĂĄrio reunir evidĂȘncias adicionais sobre a origem e a infraestrutura por trĂĄs das requisiçÔes.

O incidente serviu como um teste inesperado para decisÔes que eu jå havia tomado no desenvolvimento do blog. O banco permaneceu intacto, mas os formulårios e as notificaçÔes foram atingidos pelo volume de mensagens automatizadas. Neste relato, separo o que observei das conclusÔes técnicas e mostro as medidas que ajudam a reduzir esse tipo de risco.

1. O que os registros revelaram

O padrĂŁo era diferente do comportamento de um leitor preenchendo um formulĂĄrio. As requisiçÔes chegavam em sequĂȘncia, com valores repetitivos e conteĂșdo que nĂŁo fazia sentido como comentĂĄrio ou mensagem de contato.

Os pontos atingidos incluĂ­am:

  • Campos de texto do formulĂĄrio de contato;
  • Campos de nome ou autor dos comentĂĄrios;
  • Outros campos pĂșblicos que aceitam texto enviado pelo visitante.

Entre os valores registrados havia tentativas compatĂ­veis com Time-Based Blind SQL Injection. Nessa tĂ©cnica, o atacante tenta provocar uma demora controlada no banco e observa o tempo de resposta. Uma diferença consistente pode ajudar a inferir se uma expressĂŁo SQL foi processada, mas um atraso isolado nĂŁo prova que a injeção funcionou: latĂȘncia de rede, carga do servidor e outros fatores tambĂ©m influenciam a resposta. A OWASP explica essa famĂ­lia de ataques em sua documentação sobre Blind SQL Injection.

Exemplos representativos que apareceram nos registros:

  • WAITFOR DELAY, uma construção associada a tentativas de atraso no SQL Server;
  • SLEEP(), função usada em payloads direcionados a MySQL/MariaDB;
  • ExpressĂ”es booleanas artificiais, usadas para observar diferenças na resposta da aplicação.

Os formatos variavam, algo comum em ferramentas automatizadas que testam vårias tecnologias. O intervalo curto entre requisiçÔes reforçou a hipótese de automação, mas não permite identificar sozinho quem estava por trås dela.

A questĂŁo mais importante deixou de ser o nĂșmero de requisiçÔes e passou a ser esta: o conteĂșdo enviado pelos formulĂĄrios conseguia alterar a estrutura das consultas ao banco?

2. Como o Entity Framework Core e o LINQ ajudaram a proteger o banco

No Nerd Cult, as consultas comuns ao banco são construídas com Entity Framework Core e LINQ. Nesse caminho, o EF Core normalmente transforma a expressão em SQL parametrizado, enviando os valores do usuårio como parùmetros em vez de concatenå-los à instrução SQL. Essa separação é uma das principais defesas contra SQL Injection.

Por exemplo, uma consulta como esta:

var comentarios = await context.Comments
    .Where(c => c.AuthorName == nomeInformado)
    .ToListAsync();

nĂŁo precisa montar uma string SQL com o conteĂșdo de nomeInformado. O provedor do EF Core gera a consulta e transmite o valor como parĂąmetro. Assim, uma entrada que contenha caracteres usados em SQL continua sendo tratada como valor, e nĂŁo como parte executĂĄvel da consulta.

Isso não significa que o Entity Framework Core torne qualquer código automaticamente seguro. O risco reaparece se a aplicação montar SQL dinùmico por concatenação, usar APIs de SQL bruto de forma insegura ou construir nomes de colunas e trechos da consulta diretamente com entrada do usuårio. A documentação da Microsoft explica os cuidados necessårios em consultas SQL no EF Core, e a OWASP mantém um guia pråtico de prevenção de SQL Injection.

No meu caso, a estrutura de acesso a dados que jĂĄ utilizava foi uma parte importante da defesa. Ao revisar o incidente, nĂŁo encontrei evidĂȘncia de alteração ou vazamento do banco decorrente dessas tentativas. Essa conclusĂŁo se refere ao que consegui verificar nos registros e no estado da aplicação; nĂŁo significa que uma tecnologia, sozinha, ofereça garantia absoluta contra qualquer ataque.

A lição é simples: usar LINQ e consultas parametrizadas reduz muito o risco, mas ainda é necessårio revisar cada ponto em que a aplicação conversa com o banco, especialmente quando existe SQL escrito manualmente.

Segurança tambĂ©m começa pela proteção das contas que vocĂȘ usa para administrar seus projetos. Se seus serviços oferecem suporte a passkeys ou chaves FIDO2, uma chave fĂ­sica compatĂ­vel pode adicionar uma camada de autenticação contra phishing. Ela nĂŁo impede SQL Injection no seu cĂłdigo, mas ajuda a proteger contas compatĂ­veis.

Yubico  YubiKey 5 NFC  Chave de segurança de autenticação

Yubico - YubiKey 5 NFC - Chave de segurança de autenticação

Yubico - YubiKey 5 NFC - Chave de segurança de autenticação de dois fatores (2FA), conexão via USB-A ou NFC - Proteja suas contas online

Consulte o preço no site
(12000 avaliaçÔes)
Amazon
Comprar Agora*Link de Parceiro

3. O banco ficou intacto, mas os formulĂĄrios sofreram

Mesmo sem evidĂȘncia de comprometimento do banco, o ataque gerou trabalho. Os formulĂĄrios pĂșblicos receberam conteĂșdo automatizado e parte das mensagens precisou ser revisada ou removida.

  • ComentĂĄrios com sequĂȘncias que nĂŁo tinham relação com o assunto das publicaçÔes;
  • Mensagens indevidas no formulĂĄrio de contato;
  • NotificaçÔes por e-mail geradas por envios automatizados;
  • Tempo gasto para identificar os registros, limpar o conteĂșdo e verificar a aplicação.

Isso é importante porque segurança não se resume a impedir que uma consulta maliciosa altere o banco. Um formulårio pode continuar sendo abusado para gerar spam, consumir recursos, acionar notificaçÔes e sobrecarregar a moderação, mesmo quando as consultas estão parametrizadas.

4. Camadas extras: validação, filtro de spam e Rate Limiting

Depois do incidente, reforcei as medidas voltadas a reduzir o ruĂ­do dos formulĂĄrios e limitar envios em sequĂȘncia. Elas complementam a proteção contra SQL Injection; nĂŁo substituem consultas parametrizadas, validação de entrada nem uma revisĂŁo de segurança.

Camada 1: validação e filtro de conteĂșdo abusivo

Os campos passaram a ser tratados também como uma superfície de spam. A aplicação valida tamanho, formato e campos obrigatórios e pode aplicar regras antispam para padrÔes claramente abusivos antes de salvar a mensagem ou enviar notificaçÔes.

É importante não confundir esse filtro com uma defesa de SQL Injection. Criar uma lista negra baseada em palavras como select, union ou drop pode bloquear mensagens legítimas e ainda deixar passar payloads escritos de outra forma. A proteção principal continua sendo parametrizar as consultas. O filtro deve servir para reduzir abuso e ruído, não para decidir se um valor pode ser concatenado ao SQL.

Camada 2: Rate Limiting no ASP.NET Core

O ASP.NET Core oferece middleware de Rate Limiting para limitar a frequĂȘncia com que uma polĂ­tica aceita requisiçÔes. O recurso estĂĄ disponĂ­vel a partir do ASP.NET Core 7 e pode ajudar a conter rajadas de envios em comentĂĄrios e formulĂĄrios. Veja a documentação oficial de Rate Limiting.

A polĂ­tica precisa ser aplicada especificamente aos endpoints que recebem os envios. O exemplo abaixo limita cada endereço IP a trĂȘs requisiçÔes em uma janela de 30 segundos. É uma configuração ilustrativa: os limites devem ser ajustados ao comportamento legĂ­timo do site, e o IP pode nĂŁo representar uma Ășnica pessoa, especialmente em redes compartilhadas.

using System.Threading.RateLimiting;

builder.Services.AddRateLimiter(options =>
{
    options.RejectionStatusCode = StatusCodes.Status429TooManyRequests;

    options.AddPolicy("formularios", httpContext =>
        RateLimitPartition.GetFixedWindowLimiter(
            partitionKey: httpContext.Connection.RemoteIpAddress?.ToString()
                ?? "ip-desconhecido",
            factory: _ => new FixedWindowRateLimiterOptions
            {
                PermitLimit = 3,
                Window = TimeSpan.FromSeconds(30),
                QueueLimit = 0,
                AutoReplenishment = true
            }));
});

var app = builder.Build();

app.UseRouting();
app.UseRateLimiter();

// Aplique a polĂ­tica "formularios" apenas Ă s rotas
// de comentĂĄrio e contato, por exemplo com RequireRateLimiting
// no endpoint ou EnableRateLimiting no controller.
app.MapControllers();

app.Run();

Para que a política realmente proteja os formulårios, associe-a às rotas correspondentes usando RequireRateLimiting("formularios") ou o atributo [EnableRateLimiting("formularios")]. Apenas registrar o serviço e chamar UseRateLimiter() não aplica automaticamente essa política a todos os endpoints.

Também é importante configurar corretamente os cabeçalhos encaminhados quando a aplicação estå atrås de um proxy ou balanceador. Não confie cegamente em um cabeçalho de IP enviado pelo próprio cliente. Em aplicaçÔes com vårias instùncias, um limitador em memória por processo pode não representar um limite global; nesse cenårio, avalie controles no proxy, gateway ou infraestrutura.

Quando a política é atingida, a aplicação pode responder com HTTP 429 Too Many Requests e uma mensagem curta orientando o visitante a aguardar. O Rate Limiting reduz abuso e carga, mas não corrige uma consulta SQL vulneråvel.

5. LiçÔes para quem desenvolve aplicaçÔes web

O episódio reforçou uma ideia que vale para qualquer projeto: segurança não é um recurso que se instala no fim do desenvolvimento. Ela depende de decisÔes consistentes ao longo de toda a aplicação.

Estas são as verificaçÔes que considero prioritårias:

  • Use consultas parametrizadas: evite concatenar dados recebidos do usuĂĄrio em strings SQL;
  • Revise SQL bruto: verifique usos de FromSqlRaw, ExecuteSqlRaw e outras APIs de SQL manual, garantindo que os parĂąmetros sejam utilizados corretamente;
  • Valide no servidor: limite tamanho, formato e tipo dos dados conforme a finalidade de cada campo;
  • Use menor privilĂ©gio: a conta da aplicação no banco nĂŁo deve ter permissĂ”es alĂ©m das necessĂĄrias;
  • Proteja os formulĂĄrios: aplique Rate Limiting, antispam e controles adequados ao risco;
  • Registre eventos Ășteis: mantenha logs que permitam identificar padrĂ”es sem armazenar senhas, tokens ou outros dados sensĂ­veis;
  • Tenha um plano de resposta: revise logs, verifique integridade, atualize dependĂȘncias e saiba como suspender temporariamente um endpoint abusado.

A OWASP mantĂ©m recomendaçÔes detalhadas sobre prevenção de SQL Injection e validação de entrada. Vale consultar essas referĂȘncias ao revisar uma aplicação real.

Nenhuma dessas medidas garante invulnerabilidade. A combinação de consultas seguras, permissÔes restritas, monitoramento e limites de requisição, porém, reduz riscos diferentes e torna os incidentes mais fåceis de investigar.

6. O ataque que virou aprendizado

Em 12 de outubro de 2026, o Nerd Cult recebeu uma onda de requisiçÔes que parecia tråfego à primeira vista, mas os registros revelaram tentativas automatizadas com indícios de SQL Injection. O banco permaneceu intacto segundo as verificaçÔes que realizei, enquanto os formulårios e as notificaçÔes exigiram trabalho de limpeza.

Para mim, a principal lição nĂŁo Ă© que o Entity Framework Core resolve toda questĂŁo de segurança. É que usar LINQ e consultas parametrizadas como padrĂŁo evita uma classe importante de erros, desde que a aplicação nĂŁo contorne essa proteção com SQL dinĂąmico inseguro. As camadas adicionais, como Rate Limiting e antispam, ajudam a lidar com o abuso que ainda pode acontecer.

Se vocĂȘ mantĂ©m uma aplicação web, reserve um tempo para revisar o acesso ao banco, as permissĂ”es da conta de serviço e os endpoints pĂșblicos. Segurança nĂŁo Ă© uma promessa de que nada acontecerĂĄ; Ă© reduzir a probabilidade e o impacto de um incidente e estar preparado para investigar o que os registros mostram.

7. Precisa de ajuda com seu sistema .NET?

AlĂ©m de compartilhar conhecimento no Nerd Cult, tambĂ©m trabalho com desenvolvimento de software. Se vocĂȘ tem uma aplicação .NET que precisa de melhorias ou estĂĄ planejando um sistema novo, posso conversar sobre o projeto e ajudar a avaliar os prĂłximos passos.

Posso ajudar em trabalhos como:

  • Desenvolvimento e manutenção de aplicaçÔes web e APIs em C#/.NET;
  • RevisĂŁo de acesso a dados com Entity Framework Core e consultas SQL;
  • Implementação de validação, tratamento de erros, logs e Rate Limiting;
  • Modernização de cĂłdigo legado e melhorias de manutenção;
  • AnĂĄlise inicial de problemas tĂ©cnicos e definição de um plano de correção.

Uma revisão de código não substitui um teste de invasão ou uma auditoria de segurança especializada quando esse nível de avaliação é necessårio. O primeiro passo é entender o sistema, o escopo e os riscos antes de definir o serviço adequado.

Se quiser conversar sobre um projeto, entre em contato pelo formulĂĄrio disponĂ­vel no Nerd Cult e descreva brevemente o sistema e o que precisa melhorar. Se o conteĂșdo foi Ăștil, compartilhe este artigo com outro desenvolvedor ou responsĂĄvel por uma aplicação web.

8. Continue a leitura no Nerd Cult

Para aprofundar os temas deste relato, confira tambĂ©m estes conteĂșdos do Nerd Cult:

Chamada para colaboração: vocĂȘ jĂĄ identificou tentativas de SQL Injection, spam automatizado ou outro tipo de abuso em uma aplicação? Conte nos comentĂĄrios quais sinais observou e quais medidas ajudaram. NĂŁo publique senhas, tokens, dados pessoais, endereços IP de terceiros ou detalhes que exponham um sistema vulnerĂĄvel. Relatos responsĂĄveis ajudam outros desenvolvedores a aprender sem aumentar o risco.

Seu sistema estĂĄ preparado para receber trĂĄfego abusivo?

Revise suas consultas, limite os envios dos formulĂĄrios e monitore os registros. Se vocĂȘ precisa desenvolver ou melhorar uma aplicação .NET, entre em contato pelo formulĂĄrio do Nerd Cult para conversar sobre o seu projeto.

Compartilhe o artigo com sua equipe e use a lista de verificaçÔes como ponto de partida para uma revisão técnica.

Nerd Cult — onde o cĂłdigo encontra o rock, o cinema e a cultura geek. Porque ser nerd Ă© transformar o medo em curiosidade, e a curiosidade em poder.

#SQLInjection #SegurancaDeAplicacoes #EntityFrameworkCore #CSharp #DotNet #RateLimiting #ASPNetCore #NerdCult

Este conteĂșdo foi Ăștil para vocĂȘ?

ComentĂĄrios (0)

Nenhum comentĂĄrio ainda. Seja o primeiro a comentar!