تحديد معدل واجهات API: الخوارزميات والتنفيذ

Security2026-09-20TryQuickToolBox

واجهة API الخاصة بك تحت الهجوم. ليس من قبل قراصنة متطورين، بل من خلال نص برمجي بسيط يضرب نقاط النهاية الخاصة بك آلاف المرات في الثانية، مما يستهلك الموارد ويؤدي إلى تدهور الخدمة للمستخدمين الشرعيين. بدون تحديد المعدل، يمكن لعميل واحد سيئ السلوك أن يسقط تطبيقك بالكامل. يشرح هذا الدليل الخوارزميات الأساسية ويوضح التنفيذ العملي في Node.js و Nginx لحماية واجهة API الخاصة بك.

لماذا يهم تحديد المعدل

يتحكم تحديد المعدل في عدد الطلبات التي يمكن للعميل إجراؤها في نافذة زمنية معينة. إنه خط الدفاع الأول ضد:

بجانب الأمان، يضمن تحديد المعدل الاستخدام العادل ويساعدك على فرض قواعد العمل، مثل خطط التسعير المتدرجة.

خوارزميات تحديد المعدل

تهيمن أربع خوارزميات على تحديد معدل API. لكل منها مقايضات في الدقة واستخدام الذاكرة والتعامل مع الانفجارات.

1. النافذة الثابتة

عد الطلبات في فترات زمنية ثابتة (مثل 100 طلب في الدقيقة). عند إعادة تعيين النافذة، يتم إعادة تعيين العداد.

2. النافذة المنزلقة

تتبع الطوابع الزمنية لكل طلب وعد عدد الطلبات التي تقع ضمن آخر N ثانية. هذا يخفف الانفجارات.

3. دلو الرموز

يحتوي الدلو على رموز. تضاف الرموز بمعدل ثابت. كل طلب يستهلك رمزًا واحدًا. إذا كان الدلو فارغًا، يتم رفض الطلب.

4. الدلو المثقوب

تدخل الطلبات إلى قائمة انتظار (دلو) وتتم معالجتها بمعدل ثابت. إذا كانت قائمة الانتظار ممتلئة، يتم إسقاط الطلبات.

الخوارزميةالتعامل مع الانفجاراتالذاكرةحالة الاستخدام
النافذة الثابتةضعيفمنخفضةواجهات API البسيطة
النافذة المنزلقةجيدمتوسطةأغراض عامة
دلو الرموزممتازمتوسطةواجهات API مع تحمل الانفجارات
الدلو المثقوبلا شيءمتوسطةتخفيف حركة المرور

تنفيذ تحديد المعدل في Node.js

سنقوم بتنفيذ محدد معدل دلو الرموز باستخدام Express و Redis للحالة الموزعة. Redis ضروري عندما يكون لديك عدة نسخ من الخادم.

الخطوة 1: تثبيت التبعيات

npm install express redis

الخطوة 2: إنشاء برمجية تحديد المعدل الوسيطة

const redis = require('redis');
const client = redis.createClient();

async function tokenBucketLimiter(req, res, next) {
  const key = `rate_limit:${req.ip}`;
  const capacity = 10; // max tokens
  const refillRate = 1; // tokens per second

  const now = Date.now();
  const data = await client.hGetAll(key);
  let tokens = data.tokens ? parseFloat(data.tokens) : capacity;
  let lastRefill = data.lastRefill ? parseInt(data.lastRefill) : now;

  // Refill tokens based on elapsed time
  const elapsed = (now - lastRefill) / 1000;
  tokens = Math.min(capacity, tokens + elapsed * refillRate);

  if (tokens < 1) {
    return res.status(429).json({ error: 'Too many requests' });
  }

  tokens -= 1;
  await client.hSet(key, {
    tokens: tokens.toString(),
    lastRefill: now.toString()
  });
  await client.expire(key, 60); // auto-cleanup

  next();
}

app.use(tokenBucketLimiter);

تتحقق هذه البرمجية الوسيطة من عدد الرموز وتحدّثه بشكل ذري. للإنتاج، استخدم معاملات Redis أو نصوص Lua لتجنب حالات التسابق.

تنفيذ تحديد المعدل في Nginx

يوفر Nginx تحديد معدل مدمج مع وحدة limit_req. يستخدم خوارزمية الدلو المثقوب.

الخطوة 1: تحديد منطقة تحديد المعدل

في كتلة http من nginx.conf:

limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;

هذا ينشئ منطقة بحجم 10 ميجابايت باسم api تسمح بـ 10 طلبات في الثانية لكل IP.

الخطوة 2: تطبيق الحد

في كتلة location الخاصة بك:

location /api/ {
    limit_req zone=api burst=20 nodelay;
    proxy_pass http://backend;
}

burst=20 يسمح بانفجارات قصيرة تصل إلى 20 طلبًا. nodelay يعالج طلبات الانفجار فورًا بدلاً من وضعها في قائمة الانتظار.

أفضل الممارسات لتحديد معدل API

الأسئلة الشائعة

ما الفرق بين تحديد المعدل والخنق؟

تحديد المعدل يحظر الطلبات التي تتجاوز عتبة معينة، بينما الخنق يبطئها (على سبيل المثال، عن طريق وضعها في قائمة الانتظار أو تأخيرها). تحديد المعدل ثنائي؛ الخنق تدريجي.

أي خوارزمية تحديد معدل يجب أن أستخدم؟

لمعظم واجهات API، يوفر دلو الرموز توازنًا جيدًا: يسمح بالانفجارات لكنه يفرض معدلًا متوسطًا. إذا كنت بحاجة إلى تخفيف صارم، استخدم الدلو المثقوب. للبساطة، تعمل النافذة الثابتة لواجهات API منخفضة الحركة.

كيف أتعامل مع تحديد المعدل للمستخدمين المصادق عليهم مقابل المجهولين؟

طبق حدودًا أكثر صرامة على المستخدمين المجهولين (على سبيل المثال، حسب IP) وحدودًا أكثر سخاءً على المستخدمين المصادق عليهم (على سبيل المثال، حسب مفتاح API). يمكنك أيضًا تنفيذ حدود متدرجة بناءً على خطط الاشتراك.

هل أنت مستعد لتحليل حركة مرور API الخاصة بك؟ استخدم محلل سجلات Nginx الخاص بنا لتحليل السجلات، واكتشاف انتهاكات تحديد المعدل، وتحسين العتبات الخاصة بك.