Koruma kuralları

Kurallar panelde yazılır, kodda değil. Her kural gölgede doğar, "aktif olsaydı ne olurdu" raporu görülmeden uygulamaya alınamaz, uygulama süreli ve her an geri alınabilir.

Kuralın parçaları

Tek kural tipi vardır: rate_limit. Bir kural şunlardan oluşur:

  • Name
    route + method
    Type
    hedef
    Description

    Şablonlanmış route ve HTTP yöntemi, ör. POST /auth/login. Olay detayındaki "Koruma kuralı oluştur" bağlantısı bunu dolu getirir.

  • Name
    maxRequests / windowSec
    Type
    eşik
    Description

    Kayan pencerede izin verilen istek sayısı. 24 saatlik pencere bir "kota"dır; ayrı bir kota tipi yoktur.

  • Name
    keyBy
    Type
    'source' | 'route'
    Description

    source: kaynak (IP) başına sayım. route: route toplamı — DoW (Denial of Wallet) savunması için tavan. Kullanıcı başına sayım yoktur: SDK kimlik görmez.

  • Name
    action
    Type
    'delay' | 'reject' | 'block'
    Description

    Eşik aşıldığında ne olacağı. Aşağıda.

Eşik önerisi veriden gelir: panel son 7 günün dakikalık kovalarından route ve kaynak başına p99 × 3 önerir (tabanlı: 30 / 10). Sabit bir eşik yoktur.

Gölge raporu

Kural yaratıldığı an backend geçmiş trafiği SDK'nın aynı kayan pencere algoritmasıyla yeniden oynatır ve tek cümle üretir:

Bu kural son 7 günde aktif olsaydı 12.480 POST /api/auth/login isteğinin 31 tanesini bloklardı. Hepsi tek kaynaktan, 12 Eyl 04:12–04:19 arası, POST /api/auth/login.

Rapor iki kaynak gösterir: geçmişin yeniden oynatılması (anında) ve SDK'nın canlı işaretleri (zamanla dolar). İki kopya aynı fikstürle test edilir; raporun sayısı ile canlının davranışı eşit olmak zorundadır, yoksa rapor kanıt değil tahmin olurdu.

Süreli uygulama

Süresiz uygulama yoktur. Uygulama 10 saniye ile 24 saat arasında bir süre alır, varsayılan 30 dakika. Süre dolunca kural kendiliğinden gölgeye döner ve bildirim gider. "Geri al" her an elinizdedir; en geç bir politika çekimi sonra etkili olur.

Süre dolumunu üç yer birbirinden bağımsız uygular: SDK kendi saatiyle, /policy ucu etkin modu hesaplarken, backend'in 30 saniyelik taraması satırı düzeltip bildirim gönderirken. Backend ölürse uygulama azalabilir, asla uzayamaz.

Kademeli tepki

delay  →  reject (429)  →  block (403 + soğuma)
  • delay: istek bekletilir, sonra sunulur.
  • reject: 429 Too Many Requests + Retry-After başlığı.
  • block: eşiği aşan kaynak blockSec boyunca koşulsuz 403 alır; soğuma dolduğunda pencere hâlâ sıcaksa yeniden başlar.

Bir "challenge" adımı yoktur: genel bir API middleware'i tarayıcı etkileşimi gerektiren bir meydan okuma üretemez. IDOR gibi kanıtlanamayan bulgularda otomatik blok yoktur.

SDK tarafı

  • protection: 'on' (varsayılan): panelden uygulamaya alınan kurallar bu süreçte uygulanır. Üç koşul birlikte gerekir: yerel mod on, backend'in kural için "uygula" demesi ve enforceUntil'in SDK'nın kendi saatine göre gelecekte olması. enforceUntil yoksa kural uygulanmaz.
  • protection: 'shadow': bu kurulum yalnızca işaretler, backend ne derse desin dokunmaz. Yalnız-telemetri kurulumlar için kod seviyesinde garanti.
  • protection: 'off': politika hiç çekilmez.
  • sampleRate korumayı seyreltmez; sayaç her isteği görür.
  • Sayaç her SDK sürecinde yereldir. Yatay ölçeklenen bir uygulamada sınır süreç başına yaklaşık uygulanır; merkezî bir sayaç Argus'u istek yoluna sokardı, fail-open ilkesine aykırı.

Politika çekimi

SDK GET {endpoint}/v1/policy ucunu varsayılan 30 saniyede bir, yalnızca API anahtarıyla çeker. Anahtar kural yazamaz; yazma uçları yalnızca panel oturumuna açıktır, dolayısıyla sızmış bir anahtar kendine kural yazamaz.

  • Ağ hatası, 5xx ya da bozuk JSON: eldeki kurallar korunur.
  • 401/403 (anahtar iptal): tüm kurallar düşer — yetki yok, uygulama yok.
  • SDK kural icat etmez; yalnızca backend'den geleni ve süresini uygular.

Her karar olaya işlenir (protection.ruleId / action / enforced), böylece panel bir kuralın gerçekten kaç isteğe dokunduğunu, gölgede kaç isteğe dokunacak olduğunun yanında gösterir.