- بواسطة x32x01 ||
Rate Limiting في الـ API 🔒 ليه مينفعش تسيب السيرفر مفتوح؟
خلصت الـ API بتاعك والدنيا تمام؟ 👏طب أوعى تسيبه مفتوح كده عالبحري 😅
لأن ببساطة أي حد يقدر:
- يبعت Requests بشكل عشوائي (Spam)
- يعمل Brute Force Attack على صفحة الـ Login
- يضغط على السيرفر لحد ما يقع 💥
لو معندكش 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 بسيط يخليك تقع
- استهلاك موارد بدون فايدة
✔ السيرفر ثابت
✔ الحماية أقوى
✔ كل السيرفرات بتعد في نفس المكان
✔ حتى لو السيرفر وقع العداد لسه موجود
الخلاصة 🎯
لو بتبني API:- متسيبوش مفتوح
- حط Rate Limiting
- استخدم Redis لو عندك أكتر من Server
- شدد الحماية على Login