- بواسطة x32x01 ||
خلصت الـ API بتاعك والدنيا تمام؟ 👏
طب أوعى تسيبه مفتوح كده عالبحري 😅
لأن ببساطة أي حد يقدر:
لو معندكش Rate Limiting… مفيش حاجة توقفه، وممكن السيرفر يقع فعلًا 🫥
عشان كده Rate Limiting من أهم أساسيات حماية الـ API وأي Backend محترم.
كل يوزر بيبعت Requests للسيرفر من IP معين.
إحنا بنحدد له عدد معين من الطلبات في وقت معين.
مثال: 100 Request كل 15 دقيقة
عديتهم ؟
ترجعله:
وتقوله استنى شوية ⏳
كده انت:
✔ قللت الضغط على السيرفر
✔ قفلت باب Brute Force
✔ منعت Spam
✔ زودت أمان الـ API
فاليوزر يلف عليهم ويعدي الحد بسهولة
طب نحلها إزاي؟ 👀
ليه Redis ؟
✔ سريع جدًا
✔ مش بيتصفر لما السيرفر يقع
✔ كل السيرفرات تشوف نفس العداد
✔ مناسب للـ Distributed Systems
كده بقى عندك حماية مظبوطة 💙
مثلاً:
✔ السيرفر ثابت
✔ الحماية أقوى
✔ كل السيرفرات بتعد في نفس المكان
✔ حتى لو السيرفر وقع العداد لسه موجود
طب أوعى تسيبه مفتوح كده عالبحري 😅
لأن ببساطة أي حد يقدر:
- يبعت 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️⃣ تثبيت المكتبات
كود:
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
