CodeBlanks Logo Icon CodeBlanks

Rate limiting (hız sınırlama)

PHP kursu · Uzman · Ders 30/54

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

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

    $jitter = ____(100, 500);
    Cevabı göster
    $jitter = random_int(100, 500);
  2. 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.

  3. 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

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