Rate limiting (hız sınırlama)
Giriş ve API endpoint'lerinde hız sınırlama uygulayarak kaba kuvvet saldırısını önlemeyi öğrenirsin.
Rate limiting ne işe yarar?
Rate limiting, bir kullanıcının belirli süre içinde yapabileceği istek sayısını sınırlar. Giriş formunda kaba kuvvet (brute force), API endpoint'inde scraping ve DDoS önlemede kullanılır. Sabit pencere (fixed window) en basit yöntemdir: her dakika için bir sayaç tutar, sınır aşılırsa istek reddedilir.
Kayan pencere (sliding window) daha hassastır; son N saniyedeki zaman damgalarını sayar. Üretimde sayaçları APCu veya Redis'te tutarsın; dağıtık sistemlerde jitter için random_int ile gecikme eklenir. Sınır aşımında 429 Too Many Requests durum kodu ve Retry-After başlığı döner.
Sabit pencere vs kayan pencere
Sabit pencere her dakikanın başında sayacı sıfırlar; pencere sınırında iki katına çıkabilir. Kayan pencere son 60 saniyedeki zaman damgalarını tutar; daha hassas ama daha çok bellek kullanır. Üretimde Redis'in INCR ve EXPIRE komutlarıyla sabit pencere uygulamak en verimli yoldur.
Sınır aşımında 429 durum kodu döner; Retry-After başlığı bekleme süresini saniye olarak bildirir. Dağıtık ortamda thundering herd'i önlemek için her sunucu random_int(0, $jitter) kadar bekler. Hesabı her zaman sunucu tarafında yap; istemci tarafı sayaç güvenilmez.
Uygulama isRateLimited fonksiyonu yaz
isRateLimited(array $attempts, int $limit = 3): bool fonksiyonu tanımla. count($attempts) > $limit ise true, değilse false döndür. $attempts1 = [100, 110, 120, 130, 140] ve $attempts2 = [100, 110] tanımla. Her iki dizi için isRateLimited çağır; sonucu 1 veya 0 olarak yazdır.
Örnek çözümü göster
bool { return count($attempts) > $limit; } yaz. $attempts1 = [100, 110, 120, 130, 140]; (5 öğe > 3 = true = 1), $attempts2 = [100, 110]; (2 öğe > 3 = false = 0). Ternary ile 1/0 yazdır.
Örnek çözüm:
<?php
function isRateLimited(array $attempts, int $limit = 3): bool {
return count($attempts) > $limit;
}
$attempts1 = [100, 110, 120, 130, 140];
$attempts2 = [100, 110];
echo (isRateLimited($attempts1) ? "1" : "0") . "\n";
echo (isRateLimited($attempts2) ? "1" : "0") . "\n";
Kendini test et
-
random_int ile jitter çağrısını tamamla
$jitter = ____(100, 500);Cevabı göster
$jitter = random_int(100, 500); -
Sınır aşıldığında hangi HTTP kodu dönmeli?
- 200 OK
- 401 Unauthorized
- 403 Forbidden
- 429 Too Many Requests
Cevabı göster
429 Too Many Requests — Doğru. 429 Too Many Requests sınır aşıldığını belirtir.
-
Rate limiting kavramlarını eşleştir
- fixed_window
- Dakika başı sıfırlanır
- sliding_window
- Son N saniye sayılır
- 429
- Too Many Requests
- random_int
- Jitter için güvenli rastgele