Ограничаването на скоростта е стратегия, която можете да използвате, за да контролирате трафика в мрежата. Той ограничава броя на заявките, които потребителят може да направи в рамките на определен период от време.

Съществуват различни алгоритми за ограничаване на скоростта, всеки със своите компромиси. Един прост и популярен метод е да проследявате IP адресите на заявките и да проверявате колко време минава между заявките. След това системата може да откаже заявка, ако нейният IP адрес надвишава броя на заявките, разрешен от ограничението.

Този подход за ограничаване на скоростта е лесен за изграждане в приложение NodeJS-Express само с няколко стъпки.

Стъпка 1: Настройване на среда за разработка

Първо ще трябва да създадете и инициализирате Express приложение.

Започнете със създаване на директория на проекта, като стартирате:

mkdir експресно приложение

След това влезте в тази директория, като изпълните:

cd експресно приложение

След това инициализирайте npm, мениджърът на пакети на възли, и създайте a package.json файл във вашето приложение, като стартирате:

instagram viewer
npm init -y

The -y флаг ще създаде вашия package.json файл с всички настройки по подразбиране.

След това ще трябва да инсталирате някои зависимости. Зависимостите, необходими за този урок, са:

  • ExpressJS: ExpressJS е рамка на NodeJS който предоставя стабилен набор от функции за уеб и мобилни приложения. Той опростява процеса на изграждане на бекенд приложения с NodeJS.
  • Express Rate Limit: Express rate limit е междинен софтуер за ограничаване на скоростта за ExpressJS. Той ограничава повтарящите се заявки до публични API и/или крайни точки, като нулиране на парола, влизане на потребители и др.

Инсталирайте необходимите зависимости, като изпълните:

npm Инсталирай експресен експресен курс-лимит

Стъпка 2: Създаване на експресно приложение

Ще трябва да създадете основен експресен сървър, който слуша заявките, отправени към вашето приложение.

Първо създайте index.js файл в основната директория на вашия проект. Това ще бъде входният файл за вашето приложение.

След това добавете следния код към вашия index.js файл:

// index.js
конст експрес = изискват("експресен");
конст приложение = експрес();
конст порт = process.env. ПРИСТАНИЩЕ || 3000

app.listen (порт, () => {
конзола.log(`Приложението работи на порт ${порт}`);
});

Този код импортира експресен и създава Express приложение, като извиква express() и съхранява върнатата му стойност в ап променлива. След това слуша за трафик на порта 3000 като се обадите на слушам метод на ап обект.

Стъпка 3: Създаване на манипулатори на маршрути

След това създайте някои манипулатори на маршрути, върху които можете да приложите решението за ограничаване на скоростта.

Първо създайте папка, routes, в главната директория на вашия проект, като изпълните:

mkdir маршрути

Създайте файл, routes.js, във вашата папка routes и добавете следния код:

конст експрес = изискват("експресен");
конст рутер = експрес. Рутер();

router.get("/", (req, res) => {
res.send({ съобщение: "Здравейте, това е GET заявка" });
});

router.post("/add-demo", (req, res) => {
res.status (201).send({ съобщение: "Ресурсът е създаден успешно" });
});

router.put("/update-demo", (req, res) => {
res.status (201).send({ съобщение: "Ресурсът е актуализиран успешно" });
});

модул.износ = рутер;

Този код импортира експресен, призовава the Рутер метод на експресени съхранява стойността в променлива, рутер. The Рутер метод ви позволява да създавате модулни, монтируеми манипулатори на маршрути. Можете да създадете манипулатори на маршрути за a ВЗЕМЕТЕ искане до „/“, а ПУБЛИКУВАНЕ искане до „/add-demo“, и а СЛАГАМ искане до „/update-demo”. И накрая, експортирайте рутер променлива.

След това импортирайте рутер променлива във вашия index.js файл:

// index.js
конст маршрути = изискват("./маршрути/маршрути");

След това го използвайте като междинен софтуер във вашия файл index.js:

// index.js
ап.използване(маршрути);

Не забравяйте да поставите кодовия блок по-горе преди app.listen повикване.

Стъпка 4: Внедряване на ограничаване на скоростта

Първо създайте „междинен софтуер” в главната директория на вашия проект, като изпълните:

mkdir междинен софтуер

След това създайте файл, наречен "rate-limiter.js” в директорията на междинния софтуер. Добавете следния код към този файл:

// rate-limiter.js
конст rateLimiter = изискват("лимит на експресна-ставка");

конст ограничител = rateLimiter({
макс.: 5,
прозорец MS: 10000, // 10 секунди
съобщение: "Можеш'не правя повече заявки в момента. Опитайте отново по-късно",
});

модул.износ = ограничител

The rateLimiter функцията взема конфигурационен обект с условията за ограничаване на броя на заявките.

Свойствата в конфигурационния обект по-горе са:

  • макс: Това свойство винаги трябва да бъде a номер или функция, която връща число. Той представлява максималния брой заявки, които потребителят може да направи в рамките на определен период от време. Ако това свойство не е зададено в конфигурационния обект, то по подразбиране е 5.
  • windowsMS: Това свойство трябва винаги да е число. Той представлява времевата рамка, в която са разрешени няколко заявки милисекунди. Ако това свойство не е зададено в конфигурационния обект, то по подразбиране е 60 000 милисекунди (една минута).
  • съобщение: Този имот може да бъде a низ, JSON обект или всяка друга стойност, поддържана от Отговорът на Express.изпрати метод. Ако това свойство не е зададено в конфигурационния обект, то по подразбиране е „Твърде много заявки. Моля, опитайте отново по-късно."

След това функцията ще провери за повтарящи се заявки към вашето приложение. Ако потребител надхвърли ограничението (макс, 5) в срока (windowMS, 10s), той ще блокира заявката. Освен това ще изведе грешка „Твърде много заявки“ с код на състоянието на 429.

И накрая, импортирайте функцията за ограничаване във вашия index.js файл и го приложете като глобален междинен софтуер във вашето приложение. Направете това, като поставите app.use (ограничител) над междинния софтуер на маршрутите. Това прилага решението за ограничаване на скоростта към всички маршрути на вашето приложение.

ап.използване(ограничител);

Специфични маршрути за ограничаване на скоростта

Можете също да приложите ограничаване на скоростта за конкретни маршрути. Можете да ги конфигурирате отделно, за да отхвърлят заявки, направени в различен период от време, да показват различно съобщение и т.н.

Да предположим например, че прилагате маршрут за влизане на потребители във вашето приложение. Може да се наложи да добавите ограничаваща скоростта конфигурация за маршрута за влизане, който се различава от конфигурацията, използвана от другите маршрути.

Първо, ще трябва да премахнете ограничител като междинен софтуер на ниво приложение и го приложете, защото в ExpressJS няма вградена система за филтриране на междинен софтуер. Така че дори ако добавите конкретно решение за ограничаване на скоростта към даден маршрут, глобалният междинен софтуер пак ще работи по този маршрут.

След това създайте нова конфигурация за ограничаване на скоростта във вашия rate-limiter.js файл и го експортирайте.

конст signInLimiter = rateLimiter({
макс.: 3,
прозорец MS: 10000, //10 секунди
съобщение: "Твърде много опити за влизане. Опитайте отново по-късно."
})

модул.износ = {
ограничител,
signInLimiter
}

The signInLimiter конфигурационен обект има различен брой макс заявки и различно съобщение за грешка от общия ограничител на скоростта.

И накрая, актуализирайте своя router.js файл с кодовия блок по-долу:

// router.js
конст експрес = изискват("експресен");
конст рутер = експрес. Рутер();
конст {ограничител, signInLimiter} = изискват("../middleware/rate-limiter")

router.get("/sign-in", signInLimiter, (req, res, next) => {
res.send({ съобщение: "Здравейте, това е GET заявка" });
});

рутер.използване(ограничител)

router.post("/post", (req, res) => {
res.status (201).send({ съобщение: "Ресурсът е създаден успешно" });
});

router.put("/put", (req, res) => {
res.status (201).send({ съобщение: "Ресурсът е актуализиран успешно" });
});

модул.износ = рутер;

В кодовия блок по-горе сте импортирали ограничител и signInLimiter. След това кандидатствахте signInLimiter като специфичен ограничител на скоростта на „/sign-in” маршрут.

Накрая чрез поставяне router.use (ограничител) над останалите маршрути сте приложили ограничител като ограничител на скоростта за останалите маршрути.

Значението на ограничаването на скоростта

Ограничаването на скоростта намалява напрежението върху вашия уеб сървър, като избягва необходимостта да обработвате твърде много заявки наведнъж. Той намалява активността на ботовете, предпазва ви от атаки с отказ на услуга (DoS) и предотвратява атаки с груба сила.