تحديد المعدل هو إستراتيجية يمكنك استخدامها للتحكم في حركة المرور على الشبكة. إنه يحد من عدد الطلبات التي يمكن للمستخدم إجراؤها في إطار زمني محدد.
توجد خوارزميات مختلفة لتحديد المعدل ، ولكل منها مفاضلاتها الخاصة. تتمثل إحدى الطرق البسيطة والشائعة في تتبع عناوين IP للطلبات والتحقق من مقدار الوقت المنقضي بين الطلبات. يمكن للنظام بعد ذلك رفض طلب إذا تجاوز عنوان IP الخاص به عدد الطلبات التي يسمح بها الحد.
من السهل إنشاء هذا النهج لتحديد المعدل في تطبيق NodeJS-Express ، بخطوات قليلة فقط.
الخطوة الأولى: تهيئة بيئة تنموية
أولاً ، ستحتاج إلى إنشاء تطبيق Express وتهيئته.
ابدأ بإنشاء دليل مشروع عن طريق تشغيل:
مكدير اكسبرس التطبيق
ثم أدخل هذا الدليل عن طريق تشغيل:
قرص مضغوط التطبيق السريع
بعد ذلك ، قم بالتهيئة npm ، مدير حزمة العقدة ، وإنشاء ملف package.json ملف في التطبيق الخاص بك عن طريق تشغيل:
npm الحرف الأول
ال -ص سيخلق العلم الخاص بك package.json ملف بجميع الإعدادات الافتراضية.
بعد ذلك ، ستحتاج إلى تثبيت بعض التبعيات. التبعيات المطلوبة لهذا البرنامج التعليمي هي:
- ExpressJS: ExpressJS هو إطار عمل NodeJS يوفر مجموعة قوية من الميزات لتطبيقات الويب والجوال. يبسط عملية بناء التطبيقات الخلفية باستخدام NodeJS.
- حد السعر السريع: Express rate Limit هو برنامج وسيط يحد من المعدل لبرنامج ExpressJS. يحد من الطلبات المتكررة لواجهات برمجة التطبيقات العامة و / أو نقاط النهاية ، مثل إعادة تعيين كلمة المرور وتسجيلات دخول المستخدم وما إلى ذلك.
قم بتثبيت التبعيات المطلوبة عن طريق تشغيل:
npm تثبيت صريح معدل-حد
الخطوة الثانية: إنشاء تطبيق سريع
ستحتاج إلى إنشاء خادم Express أساسي يستمع إلى الطلبات التي يتم إجراؤها على تطبيقك.
أولاً ، قم بإنشاء ملف index.js ملف في الدليل الجذر لمشروعك. سيكون هذا هو ملف الدخول للتطبيق الخاص بك.
بعد ذلك ، أضف الكود التالي إلى ملف index.js ملف:
// index.js
مقدار ثابت صريح = يتطلب("التعبير")؛
مقدار ثابت التطبيق = صريح () ؛
مقدار ثابت المنفذ = process.env. بورت || 3000
app.listen (المنفذ ، () => {
وحدة التحكم.سجل(التطبيق يعمل على المنفذ $ {منفذ}`);
});
هذا الرمز يستورد التعبير ويقوم بإنشاء تطبيق Express عن طريق استدعاء express () وتخزين قيمته المعادة في ملف تطبيق عامل. ثم يستمع لحركة المرور على الميناء 3000 من خلال استدعاء استمع طريقة على تطبيق هدف.
الخطوة 3: إنشاء معالجات الطريق
بعد ذلك ، قم بإنشاء بعض معالجات التوجيه التي يمكنك تنفيذ حل تحديد المعدل عليها.
أولاً ، أنشئ مجلدًا ، أو مسارات ، في الدليل الجذر لمشروعك عن طريق تشغيل:
طرق مكدير
قم بإنشاء ملف ، طرق. js، داخل مجلد المسارات وأضف الكود التالي:
مقدار ثابت صريح = يتطلب("التعبير")؛
مقدار ثابت جهاز التوجيه = صريح. جهاز التوجيه () ؛router.get ("/"، (مطلوب ، الدقة) => {
res.send ({الرسالة: "مرحبًا ، هذا طلب GET" });
});router.post ("/add-demo"، (مطلوب ، الدقة) => {
res.status (201) .send ({message: "تم إنشاء المورد بنجاح" });
});router.put ("/update-demo"، (مطلوب ، الدقة) => {
res.status (201) .send ({message: "تم تحديث المورد بنجاح" });
});
وحدة.صادرات = جهاز التوجيه ؛
هذا الرمز يستورد التعبير، يستدعي جهاز التوجيه طريقة على التعبير، ويخزن القيمة في متغير ، جهاز التوجيه. ال جهاز التوجيه تتيح لك الطريقة إنشاء معالجات مسار معيارية وقابلة للتركيب. يمكنك إنشاء معالجات التوجيه لـ احصل على طلب "/"، أ بريد طلب "/add-demo"، وأ وضع طلب "/update-demo”. أخيرًا ، قم بتصدير ملف جهاز التوجيه عامل.
بعد ذلك ، قم باستيراد ملف جهاز التوجيه متغير في الخاص بك index.js ملف:
// index.js
مقدار ثابت طرق = يتطلب("./routes/routes") ؛
ثم استخدمها كبرنامج وسيط في ملف index.js الخاص بك:
// index.js
تطبيق.استعمال(الطرق);
تأكد من وضع كتلة الكود أعلاه قبل ملف التطبيق. الاستماع مكالمة.
الخطوة 4: تطبيق تحديد السعر
أولاً ، قم بإنشاء "الوسيطة"في الدليل الجذر لمشروعك من خلال تشغيل:
mkdir الوسيطة
ثم قم بإنشاء ملف يسمى "معدل محدد js"داخل دليل البرامج الوسيطة. أضف الكود التالي إلى هذا الملف:
// rate-limiter.js
مقدار ثابت rateLimiter = يتطلب("حد السعر السريع") ؛مقدار ثابت المحدد = rateLimiter ({
الحد الأقصى: 5 ،
windowMS: 10000, // 10 ثواني
رسالة: "تستطيع'لا تقدم أي طلبات أخرى في الوقت الحالي. حاول مرة أخرى في وقت لاحق",
});
وحدة.صادرات = المحدد
ال معدل تأخذ الدالة كائن تكوين بشروط للحد من عدد الطلبات.
الخصائص الموجودة في كائن التكوين أعلاه هي:
- الأعلى: يجب أن تكون هذه الخاصية دائمًا رقم أو دالة تُرجع رقمًا. يمثل الحد الأقصى لعدد الطلبات التي يمكن للمستخدم إجراؤها خلال إطار زمني محدد. إذا لم يتم تعيين هذه الخاصية في كائن التكوين ، فسيتم تعيينها افتراضيًا على 5.
- windowsMS: يجب أن تكون هذه الخاصية رقمًا دائمًا. إنه يمثل الإطار الزمني الذي يُسمح فيه بعدة طلبات مللي ثانية. إذا لم يتم تعيين هذه الخاصية في كائن التكوين ، فستكون القيمة الافتراضية 60000 مللي ثانية (دقيقة واحدة).
- رسالة: يمكن أن تكون هذه الخاصية أ سلسلةأو كائن JSON أو أي قيمة أخرى يدعمها الرد السريع. إرسال طريقة. إذا لم يتم تعيين هذه الخاصية في كائن التكوين ، فسيتم تعيينها افتراضيًا على "طلبات كثيرة جدًا. الرجاء معاودة المحاولة في وقت لاحق."
ستتحقق الوظيفة بعد ذلك من الطلبات المتكررة لتطبيقك. إذا تجاوز المستخدم الحد (الأعلى، 5) ضمن الإطار الزمني (windowMS، 10 ثوانٍ) ، سيتم حظر الطلب. سيؤدي أيضًا إلى ظهور خطأ "طلبات كثيرة جدًا" مع رمز الحالة 429.
أخيرًا ، قم باستيراد وظيفة المحدد في ملف index.js ملف وتطبيقه كبرنامج وسيط عالمي في تطبيقك. افعل ذلك عن طريق وضع app.use (محدد) فوق البرامج الوسيطة للطرق. يؤدي هذا إلى تطبيق حل تحديد المعدل على جميع مسارات تطبيقك.
تطبيق.استعمال(المحدد);
طرق محددة للحد من معدل السعر
يمكنك أيضًا تطبيق حد السعر على مسارات معينة. يمكنك تكوينها بشكل منفصل لرفض الطلبات المقدمة في إطار زمني مختلف ، وعرض رسالة مختلفة ، وما إلى ذلك.
على سبيل المثال ، افترض أنك تنفذ مسار تسجيل دخول المستخدم في تطبيقك. قد تحتاج إلى إضافة تكوين لتحديد المعدل لمسار تسجيل الدخول الذي يختلف عن التكوين المستخدم بواسطة المسارات الأخرى.
أولاً ، سيتعين عليك إزالة المحدد كبرنامج وسيط على مستوى التطبيق وتطبيقه لأنه لا يوجد نظام تصفية برمجي وسيط مضمن في ExpressJS. لذا ، حتى إذا أضفت حلًا محددًا للحد من المعدل إلى مسار ما ، فسيظل البرنامج الوسيط العالمي يعمل على هذا المسار.
بعد ذلك ، أنشئ تكوينًا جديدًا للحد من المعدل في ملف معدل محدد js ملف وتصديره.
مقدار ثابت SignInLimiter = rateLimiter ({
الحد الأقصى: 3 ،
windowMS: 10000, //10 ثواني
رسالة: "محاولات تسجيل دخول كثيرة جدًا. حاول مرة أخرى في وقت لاحق."
})
وحدة.صادرات = {
المحدد
SignInLimiter
}
ال SignInLimiter كائن التكوين له عدد مختلف من الأعلى طلبات ورسالة خطأ مختلفة من محدد المعدل العام.
أخيرًا ، قم بتحديث ملف router.js ملف مع كتلة التعليمات البرمجية أدناه:
// router.js
مقدار ثابت صريح = يتطلب("التعبير")؛
مقدار ثابت جهاز التوجيه = صريح. جهاز التوجيه () ؛
مقدار ثابت {المحدد ، SignInLimiter} = يتطلب("../middleware/rate-limiter")router.get ("/sign-in"، SignInLimiter، (req، res، next) => {
res.send ({الرسالة: "مرحبًا ، هذا طلب GET" });
});جهاز التوجيه.استعمال(المحدد)
router.post ("/post"، (مطلوب ، الدقة) => {
res.status (201) .send ({message: "تم إنشاء المورد بنجاح" });
});router.put ("/put"، (مطلوب ، الدقة) => {
res.status (201) .send ({message: "تم تحديث المورد بنجاح" });
});
وحدة.صادرات = جهاز التوجيه ؛
في كتلة التعليمات البرمجية أعلاه ، قمت باستيراد ملفات المحدد و SignInLimiter. ثم تقدمت بطلب SignInLimiter كمحدد معدل معين لـ "/sign-in" طريق.
أخيرًا ، عن طريق وضع router.use (المحدد) فوق بقية المسارات ، قمت بتطبيق المحدد باعتباره محدد المعدل لبقية المسارات.
أهمية تحديد السعر
يقلل تحديد المعدل من الضغط على خادم الويب الخاص بك عن طريق تجنب الاضطرار إلى معالجة العديد من الطلبات في وقت واحد. فهو يقلل من نشاط الروبوتات ، ويحميك من هجمات رفض الخدمة (DoS) ، ويمنع هجمات القوة الغاشمة.