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
المشاهدات
224
x32x01
x32x01
x32x01
الردود
0
المشاهدات
541
x32x01
x32x01
x32x01
الردود
0
المشاهدات
852
x32x01
x32x01
x32x01
الردود
0
المشاهدات
945
x32x01
x32x01
x32x01
الردود
0
المشاهدات
605
x32x01
x32x01
الوسوم : الوسوم
api security backend development brute force attack ddos distributed systems express http 429 node.js rate limiting redis
الدخول أو التسجيل السريع
نسيت كلمة مرورك؟
إحصائيات المنتدى
المواضيع
2,340
المشاركات
2,553
أعضاء أكتب كود
567
أخر عضو
Mohaned
عودة
أعلى