JekCMS'in başarısız giriş denemelerini nasıl izlediğini ve kötüye kullanan IP'leri Redis, memcached veya harici bir bağımlılık olmadan nasıl otomatik olarak engellediğini.
Bu Neden Önemli
Kimlik doldurma (credential-stuffing) araçları, herkese açık herhangi bir uca dakikada yüzlerce giriş denemesi ateşleyebilir. Sızdırılmış bir kullanıcı adı/şifre listesine sahip bir saldırgan, hiçbir insanın yazamayacağı hızda /admin/login.php'ye otomatik POST istekleri gönderebilir. Koruma olmadan, bu doğrudan veritabanınızın kimlik doğrulama sorgularıyla dövülmesi ve her denemenin doğru tahmin şansı olması demektir.
jekcms bunu opsiyonel bir eklenti olarak değil, giriş katmanında ele alır.
jekcms Giriş Denemelerini Gerçekte Nasıl Takip Eder
Her giriş denemesi — başarılı veya başarısız — bir login_attempts tablosuna kaydedilir. Belirli bir IP'den gelen başarısızlıklar bir eşiği aştığında, SecurityHelper::blockIp() o IP'yi bir blocked_ips tablosuna ekler ve sonraki istekler şifre kontrolüne hiç ulaşmadan reddedilir. Bu, dosya tabanlı bir anahtar-başına önbellek dosyalı rate limiter değil, veritabanı-destekli bir mekanizmadır — bu pratikte önemlidir çünkü paylaşımlı hostingde veya çok-sunuculu bir kurulumda, paylaşılan bir dosya sistemine veya Redis gibi harici bir önbelleğe ihtiyaç duymadan aynı şekilde çalışır.
// admin/login.php (basitlestirilmis)
db()->insert('login_attempts', [
'ip' => $ip,
'username'=> $username,
'success' => $success ? 1 : 0,
]);
if (!$success) {
$recentFailures = db()->fetch(
"SELECT COUNT(*) as c FROM login_attempts
WHERE ip = ? AND success = 0 AND created_at > DATE_SUB(NOW(), INTERVAL 1 HOUR)",
[$ip]
)['c'];
if ($recentFailures >= $threshold) {
SecurityHelper::blockIp($ip);
}
}
blocked_ips'e giren bir IP, kurulumun yapılandırmasına bağlı olarak elle temizlenene veya blok süresi dolana kadar engelli kalır — akıl yürütülmesi gereken saniye-bazlı bir kayan pencere yoktur, yalnızca dönen bir periyot üzerinden basit bir deneme sayısı vardır.
jekcms Neyi Yapmıyor (ve Bu Neden Sorun Değil)
Yapılandırılabilir eylem-başına limitler ve dosya tabanlı sayaçlarla keyfi eylemleri kapsayan ayrı, genel amaçlı bir rate-limiting sınıfı yoktur. Yukarıdaki giriş-denemesi koruması kimlik doğrulamaya özgüdür. REST API için ilgili kontrol, her alt sistemde yeniden kullanılan paylaşılan bir kayan-pencere rate limiter değil, basit bir anahtar-başına dakika-başına istek sınırıdır (API dokümantasyonuna bakın). Kurulumunuzun inşa ettiğiniz özel bir uç için daha geniş rate limiting'e ihtiyacı varsa, bu kendiniz ekleyeceğiniz bir şeydir — jekcms'in çekirdeği yerleşik korumasını en çok önemli olan yere odaklar: giriş formu.
Pratik Etki
Site sahibi için pratik etki: giriş formunuza karşı bir kimlik doldurma listesi çalıştıran bir saldırgan, bir şifre listesinin anlamlı bir kısmından geçmeden çok önce belirli bir IP'den denemeleri tükenir; şifresini birkaç kez art arda yanlış yazan meşru kullanıcılar ise günlük bu tür davranış için ayarlanmış eşiklerden hiç etkilenmez.