Redis, memcached veya harici bağımlılık olmadan brute force girişimlerinin %99.7'sini engelleyen dosya tabanlı rate limiting'i nasıl uyguladık.
Her Seyi Baslatan Saldiri
Kasim 2025'te musteri sitelerimizden biri tek bir saat icinde 14.000 giriş denemesi aldi. Saldirgan bir kimlik doldurma listesi kullandi — diger ihlallerden sizan kullanıcı adi/sifre ciftleri — ve /admin/login.php'ye otomatik POST istekleri gonderdi. Site ayakta kaldi cunku PHP her istegi bağımsız olarak isler, ancak veritabanı kimlik doğrulama sorgulariyla darbeler aldi ve yasal kullanıcılar 8 saniyelik yanit sureleri yasadi.
Bu olay bizi rate limiting'i JekCMS cekirdegine insa etmeye yoneltti. Eklenti olarak degil. Opsiyonel bir özellik olarak degil. Her istek yasam dongusunun temel bir parcasi olarak.
Algoritma Secimi: Kayan Pencere
Uc yaygin rate limiting algoritmasi vardir: Sabit Pencere, Token Kovasi ve Kayan Pencere. Kayan pencereyi sectik cunku dosya tabanli depolama ile dogru sekilde uygulamasi en basit olandir ve sinir durumu surprizleri yoktur.
Dosya Tabanli Uygulama
Cogu rate limiting ogretici Redis veya memcached varsayar. Biz yapmiyoruz. JekCMS paylaşımli hosting'de çalışır — PHP ve MySQL alirsiniz, nokta. Rate limiter'imiz dosya sistemini kullanir. Her IP/eylem kombinasyonu kendi dosyasini alir, boylece farkli istemciler arasinda catisma yoktur. LOCK_EX bayragi birden fazla istek ayni anda geldiginde yaris kosullarini onler.
Giris Kisitlamasi
Giris girişimleri basarisizlik sayisina gore giderek daha siki rate limit'ler alir. Cift katmanli yaklasim: IP başına saatte 30 deneme + kullanıcı adi başına 15 dakikada 5 deneme. Saldirgan bir hesapta farkli sifreler denerse 5 denemeden sonra kilitlenir, birden fazla hesapta ayni sifreyi denerse ayni IP'den 30 denemeden sonra kilitlenir.
API Rate Limiting
API endpointleri IP başına degil API anahtari başına ayri bir rate limit yapılandırmasi kullanir: varsayilan 100/saat, upload 20/saat, arama 60/dakika, webhook 200/saat.
Cop Toplama
Rate limit dosyalari birikir. Her istekte %1 olasilikla cop toplama calistiriyoruz: 1 saatten eski dosyalari temizle.
Sonuclar
12 sitenin tamamina rate limiting dagitildiktan sonra: brute force girişimleri gunde ~2.000'den kilitleme oncesi 6'dan az başarılı istege dustu. Saldirilar sirasinda veritabanı yuku %97 dustu. Sifir yasal kullanıcı yanlis sekilde rate-limited edildi.