הגבלת קצב היא אסטרטגיה שבה תוכל להשתמש כדי לשלוט בתנועה ברשת. זה מגביל את מספר הבקשות שמשתמש יכול לבצע במסגרת זמן מסוימת.
קיימים אלגוריתמים שונים להגבלת שיעורים, לכל אחד פשרות משלו. שיטה אחת פשוטה ופופולרית היא לעקוב אחר כתובות ה-IP של בקשות ולבדוק כמה זמן עובר בין בקשות. לאחר מכן, המערכת יכולה לדחות בקשה אם כתובת ה-IP שלה חורגת ממספר הבקשות שהמגבלה מאפשרת.
קל לבנות את הגישה הזו להגבלת תעריפים באפליקציית NodeJS-Express, בכמה שלבים בלבד.
שלב 1: הגדרת סביבת פיתוח
ראשית, יהיה עליך ליצור ולאתחל יישום Express.
התחל על ידי יצירת ספריית פרויקט על ידי הפעלת:
mkdir express-app
לאחר מכן היכנס לספרייה זו על ידי הפעלת:
CD אפליקציה אקספרס
לאחר מכן, אתחול npm, מנהל חבילות הצומת, וליצור א package.json קובץ ביישום שלך על ידי הפעלת:
npm init -y
ה -y הדגל ייצור את שלך package.json קובץ עם כל הגדרות ברירת המחדל.
לאחר מכן, תצטרך להתקין כמה תלות. התלות הנדרשות למדריך זה הן:
- ExpressJS: ExpressJS היא מסגרת NodeJS המספק קבוצה חזקה של תכונות עבור יישומי אינטרנט וניידים. זה מפשט את התהליך של בניית יישומי backend עם NodeJS.
- מגבלת תעריף אקספרס: הגבלת קצב אקספרס היא תוכנת ביניים מגבילת קצב עבור ExpressJS. זה מגביל בקשות חוזרות לממשקי API ו/או נקודות קצה ציבוריים, כגון איפוסי סיסמאות, כניסות משתמשים וכו'.
התקן את התלות הנדרשת על ידי הפעלת:
npm להתקין תעריף אקספרס-לְהַגבִּיל
שלב 2: יצירת יישום אקספרס
תצטרך ליצור שרת Express בסיסי שמאזין לבקשות המוגשות לאפליקציה שלך.
ראשית, צור א index.js קובץ בספריית השורש של הפרויקט שלך. זה יהיה קובץ הכניסה עבור הבקשה שלך.
לאחר מכן, הוסף את הקוד הבא שלך index.js קוֹבֶץ:
// index.js
const express = לִדרוֹשׁ("אֶקְסְפּרֶס");
const app = express();
const port = process.env. PORT || 3000
app.listen (יציאה, () => {
לְנַחֵם.עֵץ('אפליקציה פועלת ביציאה ${port}`);
});
קוד זה מייבא אֶקְסְפּרֶס ויוצר יישום Express על ידי קריאה ל-express() ואחסון ערך ההחזר שלו ב- אפליקציה מִשְׁתַנֶה. לאחר מכן הוא מאזין לתנועה בנמל 3000 על ידי התקשרות ל להקשיב שיטה על אפליקציה לְהִתְנַגֵד.
שלב 3: יצירת מטפלי מסלולים
לאחר מכן, צור כמה מטפלי מסלולים שבהם תוכל ליישם את הפתרון להגבלת הקצב.
ראשית, צור תיקיה, מסלולים, בספריית השורש של הפרויקט שלך על ידי הפעלת:
מסלולי mkdir
צור קובץ, routes.js, בתוך תיקיית המסלולים שלך והוסף את הקוד הבא:
const express = לִדרוֹשׁ("אֶקְסְפּרֶס");
const נתב = אקספרס. נתב();router.get("/", (req, res) => {
res.send({ הודעה: "שלום, זוהי בקשת GET" });
});router.post("/add-demo", (req, res) => {
res.status (201).send({ message: "המשאב נוצר בהצלחה" });
});router.put("/update-demo", (req, res) => {
res.status (201).send({ message: "המשאב עודכן בהצלחה" });
});
מודול.יצוא = נתב;
קוד זה מייבא אֶקְסְפּרֶס, מתקשר ל נתב שיטה על אֶקְסְפּרֶס, ומאחסן את הערך במשתנה, נתב. ה נתב השיטה מאפשרת לך ליצור מטפלי מסלול מודולריים הניתנים להרכבה. אתה יכול ליצור מטפלי מסלול עבור א לקבל בקשה ל"/", א הודעה בקשה ל"/add-demo", וא לָשִׂים בקשה ל"/update-demo”. לבסוף, ייצא את ה נתב מִשְׁתַנֶה.
לאחר מכן, ייבא את ה נתב משתנה אצלך index.js קוֹבֶץ:
// index.js
const מסלולים = לִדרוֹשׁ(./routes/routes");
לאחר מכן, השתמש בו בתור תוכנת ביניים בקובץ index.js שלך:
// index.js
אפליקציה.להשתמש(מסלולים);
הקפד למקם את בלוק הקוד למעלה לפני ה app.האזן שִׂיחָה.
שלב 4: יישום הגבלת תעריפים
ראשית, צור "תוכנת ביניים" בתיקיית השורש של הפרויקט שלך על ידי הפעלת:
תוכנת האמצע של mkdir
לאחר מכן צור קובץ בשם "rate-limiter.js" בתוך ספריית התווך. הוסף את הקוד הבא לקובץ זה:
// rate-limiter.js
const שיעור מגביל = לִדרוֹשׁ("הגבלת שיעור-אקספרס");const limiter = rateLimiter({
מקסימום: 5,
windowsMS: 10000, // 10 שניות
הוֹדָעָה: "אתה יכול'לא להגיש בקשות נוספות כרגע. נסה שוב מאוחר יותר",
});
מודול.יצוא = מגביל
ה מגביל שיעור function לוקחת אובייקט תצורה עם התנאים להגביל את מספר הבקשות.
המאפיינים באובייקט התצורה שלמעלה הם:
- מקסימום: מאפיין זה חייב להיות תמיד א מספר או פונקציה שמחזירה מספר. הוא מייצג את המספר המרבי של בקשות שמשתמש יכול לבצע במסגרת זמן מוגדרת. אם מאפיין זה אינו מוגדר באובייקט התצורה, הוא כברירת מחדל 5.
- windowsMS: מאפיין זה צריך להיות תמיד מספר. הוא מייצג את מסגרת הזמן שבה ניתן להיכנס למספר בקשות אלפיות השנייה. אם מאפיין זה אינו מוגדר באובייקט התצורה, ברירת המחדל היא 60000 אלפיות שניות (דקה אחת).
- הוֹדָעָה: נכס זה יכול להיות א חוּט, אובייקט JSON, או כל ערך אחר שנתמך על ידי תגובת אקספרס.שלח שיטה. אם מאפיין זה אינו מוגדר באובייקט התצורה, ברירת המחדל היא "יותר מדי בקשות. בבקשה נסה שוב מאוחר יותר."
לאחר מכן, הפונקציה תבדוק אם יש בקשות חוזרות ונשנות לאפליקציה שלך. אם משתמש חורג מהמגבלה (מקסימום, 5) במסגרת הזמן (windowsMS, 10 שניות), זה יחסום את הבקשה. זה גם יזרוק שגיאת "יותר מדי בקשות" עם קוד סטטוס של 429.
לבסוף, ייבא את פונקציית המגביל שלך index.js קובץ והחל אותו כתווך גלובלי ביישום שלך. עשה זאת על ידי מיקום app.use (מגביל) מעל תוכנת המסלולים. זה מחיל את הפתרון להגבלת התעריפים על כל המסלולים של האפליקציה שלך.
אפליקציה.להשתמש(מַגְבִּיל);
מגביל תעריף מסלולים ספציפיים
אתה יכול גם להחיל הגבלת תעריפים על מסלולים ספציפיים. אתה יכול להגדיר אותם בנפרד כדי לדחות בקשות שנעשות במסגרת זמן שונה, להציג הודעה אחרת וכו'.
לדוגמה, נניח שאתה מיישם מסלול כניסה למשתמש באפליקציה שלך. ייתכן שיהיה עליך להוסיף תצורה מגבילת תעריף עבור מסלול הכניסה השונה מהתצורה המשמשת את המסלולים האחרים.
ראשית, תצטרך להסיר מַגְבִּיל בתור תוכנת ביניים ברמת היישום והחל אותה מכיוון שאין מערכת סינון מתווך מובנית ב-ExpressJS. אז גם אם תוסיף פתרון מגביל קצב למסלול, תוכנת הביניים הגלובלית עדיין תפעל בנתיב הזה.
לאחר מכן, צור תצורה חדשה להגבלת תעריפים ב- rate-limiter.js קובץ וייצא אותו.
const signInLimiter = rateLimiter({
מקסימום: 3,
windowsMS: 10000, //10 שניות
הוֹדָעָה: "יותר מדי ניסיונות כניסה. נסה שוב מאוחר יותר."
})
מודול.יצוא = {
מַגְבִּיל,
signInLimiter
}
ה signInLimiter לאובייקט תצורה יש מספר שונה של מקסימום בקשות והודעת שגיאה שונה ממגביל התעריפים הכללי.
לבסוף, עדכן את שלך router.js קובץ עם בלוק הקוד למטה:
// router.js
const express = לִדרוֹשׁ("אֶקְסְפּרֶס");
const נתב = אקספרס. נתב();
const {limiter, signInLimiter} = לִדרוֹשׁ("../middleware/rate-limiter")router.get("/sign-in", signInLimiter, (req, res, next) => {
res.send({ הודעה: "שלום, זוהי בקשת GET" });
});נתב.להשתמש(מַגְבִּיל)
router.post("/post", (req, res) => {
res.status (201).send({ message: "המשאב נוצר בהצלחה" });
});router.put("/put", (req, res) => {
res.status (201).send({ message: "המשאב עודכן בהצלחה" });
});
מודול.יצוא = נתב;
בבלוק הקוד למעלה, ייבאת מַגְבִּיל ו signInLimiter. ואז הגשת בקשה signInLimiter כמגביל שיעור ספציפי ל"/sign-in"מסלול.
לבסוף, על ידי הצבה router.use (מגביל) מעל שאר המסלולים, החלת מגביל בתור מגביל תעריף עבור שאר המסלולים.
החשיבות של הגבלת תעריפים
הגבלת תעריפים מפחיתה את העומס על שרת האינטרנט שלך על ידי מניעת הצורך לעבד יותר מדי בקשות בבת אחת. זה מוריד את פעילות הבוטים, מגן עליך מפני התקפות מניעת שירות (DoS) ומונע התקפות בכוח גס.