Merhaba,
Geçtiğimiz günlerde WebRapor.Net uygulamamda kayıt ekranına bir bot dadandı. Günde 5-10 tane tamamen boş ve anlamsız kayıt oluşturuyordu. Veritabanını kirletiyor, yönetim panelini şişiriyordu.
Karmaşık CAPTCHA sistemleri eklemek, kullanıcı deneyimini bozmak istemediğim için çok daha basit ve etkili bir yöntem buldum: Honeypot (bal küpü tuzağı) + Zaman Kontrolü (Timestamp).
Neden bu yöntemi tercih ettim?
- Kullanıcıya hiçbir ekstra işlem yaptırmıyoruz (CAPTCHA yok).
- Kodda büyük değişiklik gerekmiyor.
- Basit botların %99’unu anında yakalıyor.
- Tamamen server-side çalışıyor, client-side JavaScript’e bağımlı değil.
1. View tarafı – Kayit.cshtml
Form etiketinden (<form>) hemen sonra şu iki alanı ekliyoruz:
<!-- Honeypot tuzağı - Botlar doldurur, insanlar doldurmaz -->
<input type="text" name="honeypot" value=""
style="display:none !important; visibility:hidden !important;
position:absolute !important; left:-9999px !important;"
tabindex="-1" autocomplete="off" />
<!-- Formun yüklendiği anın timestamp değeri -->
<input type="hidden" name="timestamp" value="@DateTime.Now.Ticks" />
2. Controller tarafı – HomeController.cs
POST metodunun en üstüne şu kontrolleri ekliyoruz:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Kayit(KayitViewModel model, string dilKodu = "tr")
{
// 1. Honeypot kontrolü
if (!string.IsNullOrEmpty(Request.Form["honeypot"]))
return new HttpStatusCodeResult(400);
// 2. Timestamp kontrolü - 3 saniyeden kısa sürede gönderildiyse bot
if (long.TryParse(Request.Form["timestamp"], out long startTicks))
{
var elapsedMs = (DateTime.Now.Ticks - startTicks) / TimeSpan.TicksPerMillisecond;
if (elapsedMs < 3000) // minimum 3 saniye
return new HttpStatusCodeResult(400);
}
// Kontrollerden geçtiyse normal kayıt işlemlerine devam...
// ...
}
Uyguladıktan sadece birkaç saat sonra bot tamamen sustu. Artık boş kayıt gelmiyor.
Gerçek bir insan formu ortalama 8-10 saniyede doldururken, botlar milisaniyeler içinde gönderim yapıyor. Bu iki basit kontrol bile çoğu basit botu durdurmaya yetiyor.
İsterseniz 3000 değerini 4000 veya 5000 milisaniyeye de çıkarabilirsiniz, hiçbir gerçek kullanıcı bundan rahatsız olmaz.
Karmaşık çözümlere gerek yok. Bazen en basit yöntem en etkili oluyor.
Selamlar!
