Konu Başlıkları
Yükleniyor...

CAPTCHA'sız Bot Koruması: Zaman Ölçümü, Honeypot ve Rate Limit

CAPTCHA Yerine Kullanabileceğin Bot Koruma Yöntemleri

CAPTCHA siteye gelen herkesi baştan şüpheli sayar. Bot trafiğini azaltır, ama bedelini gerçek kullanıcı öder: okunmayan karakterler, üst üste gelen görsel bulmacalar, ekran okuyucuyla geçilemeyen bir adım. Aynı işin büyük kısmını kullanıcı hiç fark etmeden yapan yöntemler var ve çoğu sunucu tarafında birkaç satır.

CAPTCHA neyi durduruyor

CAPTCHA'nın durdurduğu şey, aslında formu tarayıcı olmadan doğrudan POST eden ucuz betiklerdir. Ciddi bir spam operasyonu bunu yıllardır aşıyor: bulmacayı çözdürmek için insan iş gücü kullanan servisler var ve fiyatları bin çözüm başına birkaç dolar. Yani CAPTCHA saldırganın maliyetini biraz artırır, kullanıcının maliyetini ise her seferinde artırır. Bu takas, formun karşılığında ne olduğuna göre değerlendirilmeli.

Bir iletişim formunda bu takas neredeyse hep kaybettirir. Günde on beş mesaj alan bir formda spam'i elle silmek, dönüşümün bir kısmını kapıda kaybetmekten ucuzdur.

Zaman ölçümü: ucuz, ama ne yaptığını bil

Form render edildiğinde imzalı bir zaman damgası koyarsın, POST geldiğinde aradaki farka bakarsın. İki saniyenin altında dolan bir iletişim formu insan işi değildir. Bu kontrol kullanıcıya hiçbir ek adım getirmez ve otomatik trafiğin kayda değer bir kısmını eler.

Sınırı da açık: bot'un yapması gereken tek şey beklemek. Betiğe bir sleep(5) ekleyen saldırganın önünde bu kontrol yoktur. Zaman ölçümü tembel botları eler, hedefli saldırıyı elemez, ve bunu bilerek kurmak gerekir. Damgayı gizli input'a düz metin yazmak da işe yaramaz; imzalanmamış bir değeri bot kendi belirler.

Honeypot ve şifre yöneticisi sorunu

Görünmeyen bir alan koyarsın, dolduran olursa isteği atarsın. Etkili yöntem, ama iki tarafı da yanlış kurmak kolay.

Birincisi erişilebilirlik. Alanı display:none ile gizlersen ekran okuyucu da atlar, sorun yok; fakat sadece ekrandan çıkaran bir konumlandırma kullanırsan ekran okuyucu alanı okur ve kullanıcı doldurur. Bu durumda alana aria-hidden ve tabindex="-1" vermek gerekir.

İkincisi tarayıcı otomatik doldurması. Alanın adı email2 ya da address gibi tanıdık bir şeyse şifre yöneticisi onu içerik sanıp doldurur, sen de gerçek kullanıcıyı bot diye reddedersin. Alan adı hem tahmin edilemez hem de otomatik doldurmayı tetiklemeyecek bir şey olmalı, üstelik autocomplete="off" ile birlikte (hazır form eklentilerinin bir kısmı alanı hâlâ düpedüz honeypot diye adlandırıyor, o da tersinden aynı sorun).

Rate limit: asıl karar anahtarda

Rate limit'in zor kısmı sayaç değil, sayacın neye bağlandığıdır. IP'ye bağlarsan mobil operatörlerin CGNAT'ı arkasındaki binlerce aboneyi aynı kovaya koyarsın; tek bir kurumsal ofisin çıkış IP'si de öyle. Dakikada beş istek gibi bir sınır, o ofiste öğle arasında forma yönelen on kişiyi kapıda karşılar.

Pratikte işe yarayan kurulum katmanlıdır: IP başına gevşek bir tavan (kötüye kullanımı kesmeye yeter), form ya da hesap başına dar bir tavan, ve tekrar eden içerik için ayrı bir kontrol. Sınıra takılan isteği sessizce düşürmek yerine 429 ve Retry-After ile cevaplamak, gerçek kullanıcının ne olduğunu anlamasını sağlar.

Sayacı uygulama belleğinde tutmak da yaygın bir hata. İki sunucuya çıktığın anda her biri kendi sayacını tutar ve sınır ikiye katlanır. Paylaşımlı bir yerde (Redis, veritabanı, ters vekil) tutulmalı.

Sosyal giriş bir bot çözümü değil

Sosyal hesapla giriş, kayıt sürtünmesini azaltır. Bot koruması olarak ise zayıftır: otomatik oluşturulmuş hesaplar bu kapıdan da geçer. Yorum ya da iletişim formunu sosyal girişin arkasına koymak, spam'i azaltmaktan çok anonim kalmak isteyen gerçek kullanıcıyı eler. Kayıt akışında yeri var, tek seferlik form gönderiminde yok.

CAPTCHA'yı ne zaman bırakmam

Bir kapıyı zorlamak saldırgana doğrudan para kazandırıyorsa görsel doğrulama hâlâ yerinde durur: giriş ekranında art arda başarısız denemeden sonra, ödeme ve kupon kullanımında, hediye çeki bakiyesi sorgulayan uçlarda. Buralarda ölçüt kullanıcı konforu değil, denemenin maliyetidir.

Bunun dışında sıra şu: zaman damgası ve honeypot ile başla, sunucu tarafında rate limit kur, spam oranını bir hafta ölç. Kalan hacim elle yönetilebiliyorsa CAPTCHA'ya hiç dönme. Yönetilemiyorsa da doğrudan görsel bulmacaya değil, önce şüpheli isteklere uygulanan koşullu bir doğrulamaya geç.

Kaynaklar