CodeBlanks Logo Icon CodeBlanks

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.

Başlangıç kodu

index.php
<?php
// Hız sınırlama fonksiyonunu tanımla: dizi ve sınır alır
// Dizi boyutunu sınır ile karşılaştır, bool döndür
// İki farklı dizi örneği tanımla
// Her ikisi için çağrı yap, 1/0 yazdır

Örnek çözüm

index.php
<?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";

Beklenen çıktı

1
0

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 random_int ile jitter çağrısını tamamla

Soru
$jitter = ____(100, 500);
Cevap
$jitter = random_int(100, 500);

Açıklama: random_int kriptografik olarak güvenli rastgele tamsayı üretir.

2 Sınır aşıldığında hangi HTTP kodu dönmeli?

  • 200 OK
  • 401 Unauthorized
  • 403 Forbidden
  • 429 Too Many Requests Doğru cevap

Açıklama: 429 Too Many Requests sınır aşıldığını belirtir.

3 Rate limiting kavramlarını eşleştir

Kavram Anlamı
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

Uzman bölümündeki tüm dersler