DDoS Korumalı API Rate Limit Sistemi (Node.js & Express)

İMRAN

Archive Forum Kurucu
Admin
Katılım
10 Nisan 2025
Mesajlar
1,654
Çözümler
1
Reaksiyon puanı
139
Konum
Türkiye

1️⃣ Temel Mantık (Kısaca)​


  • Aynı IP / kullanıcı çok kısa sürede çok fazla istek atarsa ⇒ istekleri yavaşlat / engelle
  • Amaç:
    • Bot / flood / basit DDoS’ları hafifletmek
    • API’yı korumak
    • Kaynak tüketimini sınırlamak



2️⃣ Temel Rate Limit Kurulumu (express-rate-limit)​



Bash:
npm install express express-rate-limit
js
Kodu kopyala

JavaScript:
// app.js veya main server dosyan
const express = require('express');
const rateLimit = require('express-rate-limit');
const app = express();

// Global rate limit (örn: 15 dakikada 100 istek)
const globalLimiter = rateLimit({
  windowMs: 15 * 60 * 1000,  // 15 dakika
  max: 100,                  // 15 dk'da max 100 istek
  standardHeaders: true,     // Rate limit headerlarını ekler
  legacyHeaders: false,      // X-RateLimit-* kapatır
  message: {
    status: 429,
    error: 'Çok fazla istek gönderdiniz. Lütfen daha sonra tekrar deneyin.'
  }
});

// Tüm API için uygula
app.use('/api/', globalLimiter);

app.get('/api/test', (req, res) => {
  res.json({ ok: true });
});

app.listen(3000, () => console.log('API 3000 portunda.'));

3️⃣ Seviyeli Koruma Tablosu (Burst + Normal Trafik)​

SeviyeKapsamLimitKullanım Senaryosu
Level 1Global API15 dk’da 100 istekGenel DDoS / flood azaltma
Level 2Kritik endpoint (/login)5 dk’da 10 istekBrute-force / deneme saldırılarını azaltma
Level 3Public endpoint (örn /search)1 dk’da 30 istekArama / filtreleme suistimaline karşı



Login için daha sıkı limit örneği:​

JavaScript:
const loginLimiter = rateLimit({
  windowMs: 5 * 60 * 1000,  // 5 dakika
  max: 10,                  // 5 dk'da max 10 deneme
  message: {
    status: 429,
    error: 'Çok fazla giriş denemesi yapıldı. Lütfen birkaç dakika sonra tekrar deneyin.'
  }
});

app.post('/api/login', loginLimiter, (req, res) => {
  // login işlemleri
});

4️⃣ IP Bazlı Rate Limit + Proxy Arkasında Çalışma​


Eğer Cloudflare / Nginx arkası kullanıyorsan, gerçek IP’yi alman lazım:



JavaScript:
app.set('trust proxy', 1); // 1 veya true (Cloudflare / reverse proxy için)

// Sonra rate limiter IP’yi doğru görür
app.use('/api/', globalLimiter);

5️⃣ Daha Güçlü Sistem: Dağıtık (Redis) Rate Limit Mantığı​

Gerçek bir DDoS’e karşı tek sunucu yeterli olmayabilir.
Bir üst seviye için Redis tabanlı storage kullanılır (aynı limit birden fazla node’da paylaşılır).
Mantık tablosu:
BileşenGörev
ExpressAPI sunucusu
express-rate-limitMiddleware (limit mantığı)
RedisSayaçları depolar, cluster ortamında paylaştırır
Proxy (Nginx/CF)İlk savunma hattı, IP’yi iletir
(İstersen bir sonraki adımda Redis’li tam kod iskeletini de yazarım.)

6️⃣ Güvenlik Notları (Forumda altına yazmalık)​

  • Bu sistem saldırı yapmaz, sadece saldırı / flood’u frenler
  • Tamamen Blue Team / savunma amaçlıdır
  • DDoS’u tamamen yok etmez ama küçük / orta ölçekli floodlar için çok etkilidir
  • Özellikle: /api/login, /api/register, /search, /reset-password gibi endpoint’lerde mutlaka kullanılmalı
 
Geri
Üst Alt