Rate Limiting في API باستخدام Redis

x32x01
  • بواسطة x32x01 ||

Rate Limiting في الـ API 🔒 ليه مينفعش تسيب السيرفر مفتوح؟​

خلصت الـ API بتاعك والدنيا تمام؟ 👏
طب أوعى تسيبه مفتوح كده عالبحري 😅
لأن ببساطة أي حد يقدر:
  • يبعت Requests بشكل عشوائي (Spam)
  • يعمل Brute Force Attack على صفحة الـ Login
  • يضغط على السيرفر لحد ما يقع 💥
تخيل حد بيجرب 1000 باسورد في الدقيقة!
لو معندكش Rate Limiting… مفيش حاجة توقفه، وممكن السيرفر يقع فعلًا 🫥

عشان كده Rate Limiting من أهم أساسيات حماية الـ API وأي Backend محترم.

يعني إيه Rate Limiting أصلاً؟ 🤔​

ببساطة:
كل يوزر بيبعت Requests للسيرفر من IP معين.
إحنا بنحدد له عدد معين من الطلبات في وقت معين.

مثال: 100 Request كل 15 دقيقة
عديتهم ؟
ترجعله: 429 Too Many Requests
وتقوله استنى شوية ⏳
كده انت:
✔ قللت الضغط على السيرفر
✔ قفلت باب Brute Force
✔ منعت Spam
✔ زودت أمان الـ API



Rate Limiting بيشتغل إزاي؟ ⚙️​

المكتبة ببساطة:
  • تعد كل Request
  • تخزن العداد في Memory
  • تزود الرقم مع كل Request
بس هنا عندنا مشكلتين 👇

❌ المشكلة 1: السيرفر عمل Restart​

كل العدادات بتتصفر

❌ المشكلة 2: عندك أكتر من Server​

كل واحد بيعد لوحده 😅
فاليوزر يلف عليهم ويعدي الحد بسهولة

طب نحلها إزاي؟ 👀



الحل الاحترافي: استخدام Redis مع Rate Limiting 🔥​

بدل ما نخزن العداد في Memory السيرفر - نخزنه في Redis
ليه Redis ؟
✔ سريع جدًا
✔ مش بيتصفر لما السيرفر يقع
✔ كل السيرفرات تشوف نفس العداد
✔ مناسب للـ Distributed Systems
كده بقى عندك حماية مظبوطة 💙



تطبيق Rate Limiting باستخدام Node.js و Express 🚀​

لو شغال بـ Node.js + Express، الموضوع سهل جدًا.

1️⃣ تثبيت المكتبات​

Code:
npm install express-rate-limit redis rate-limit-redis

2️⃣ Import المكتبات​

JavaScript:
const rateLimit = require("express-rate-limit");
const RedisStore = require("rate-limit-redis");
const { createClient } = require("redis");

3️⃣ توصيل Redis​

JavaScript:
const redisClient = createClient({
  url: "redis://localhost:6379"
});

redisClient.connect();

4️⃣ إعداد الـ Limiter​

JavaScript:
const limiter = rateLimit({
  windowMs: 15 * 60 * 1000, // 15 دقيقة
  max: 100, // أقصى عدد Requests
  message: "Too many requests",
  store: new RedisStore({
    sendCommand: (...args) => redisClient.sendCommand(args)
  })
});

5️⃣ تطبيق الحماية​

تقدر تطبقه على:

✔ كل الـ API​

JavaScript:
app.use(limiter);

✔ Endpoint معين​

JavaScript:
app.use("/api/v1/login", limiter);

✔ Resource كامل​

JavaScript:
app.use("/api/v1", limiter);



نصيحة مهمة جدًا 🔥​

الأفضل تعمل Rate Limiting مختلف للـ Login Endpoint
مثلاً:
  • 5 Requests كل 10 دقائق
    علشان تمنع Brute Force بقوة 💪
JavaScript:
const loginLimiter = rateLimit({
  windowMs: 10 * 60 * 1000,
  max: 5,
  message: "Too many login attempts"
});

app.use("/api/v1/login", loginLimiter);



ليه Rate Limiting مهم في أمان الـ API؟ 🛡️​

بدونه ممكن يحصل:
  • Server Crash
  • Password Guessing
  • DDoS بسيط يخليك تقع
  • استهلاك موارد بدون فايدة
لكن مع Redis + Rate Limit:
✔ السيرفر ثابت
✔ الحماية أقوى
✔ كل السيرفرات بتعد في نفس المكان
✔ حتى لو السيرفر وقع العداد لسه موجود



الخلاصة 🎯​

لو بتبني API:
  • متسيبوش مفتوح
  • حط Rate Limiting
  • استخدم Redis لو عندك أكتر من Server
  • شدد الحماية على Login
الأمان مش رفاهية… الأمان أساس أي Backend محترم 💙
 
المواضيع ذات الصلة
x32x01
الردود
0
المشاهدات
717
x32x01
x32x01
x32x01
الردود
0
المشاهدات
734
x32x01
x32x01
x32x01
الردود
0
المشاهدات
129
x32x01
x32x01
x32x01
الردود
0
المشاهدات
386
x32x01
x32x01
x32x01
الردود
0
المشاهدات
461
x32x01
x32x01
الدخول أو التسجيل السريع
نسيت كلمة مرورك؟
إحصائيات المنتدى
المواضيع
2,510
المشاركات
2,703
أعضاء أكتب كود
578
أخر عضو
محمود سليمان اب
عودة
أعلى