Ograniczanie szybkości to strategia, której można użyć do kontrolowania ruchu w sieci. Ogranicza liczbę żądań, które użytkownik może złożyć w określonym czasie.

Istnieją różne algorytmy ograniczania szybkości, każdy z własnymi kompromisami. Jedną z prostych i popularnych metod jest śledzenie adresów IP żądań i sprawdzanie, ile czasu upływa między żądaniami. System może następnie odrzucić żądanie, jeśli jego adres IP przekroczy liczbę żądań dozwolonych przez limit.

Takie podejście do ograniczania szybkości można łatwo zbudować w aplikacji NodeJS-Express, wykonując zaledwie kilka kroków.

Krok 1: Konfigurowanie środowiska programistycznego

Najpierw musisz utworzyć i zainicjować aplikację Express.

Zacznij od utworzenia katalogu projektu, uruchamiając:

mkdir ekspresowa aplikacja

Następnie wejdź do tego katalogu, uruchamiając:

płyta CD ekspresowa aplikacja

Następnie zainicjuj npm, menedżer pakietów węzłów, i stworzyć pakiet.json plik w swojej aplikacji, uruchamiając:

npm początek -y

The -y flaga utworzy twoją pakiet.json plik ze wszystkimi ustawieniami domyślnymi.

Następnie musisz zainstalować kilka zależności. Zależności wymagane w tym samouczku to:

  • ExpressJS: ExpressJS to framework NodeJS który zapewnia solidny zestaw funkcji dla aplikacji internetowych i mobilnych. Upraszcza proces budowania aplikacji backendowych za pomocą NodeJS.
  • Ekspresowy limit szybkości: Express rate limit to oprogramowanie pośredniczące ograniczające szybkość dla ExpressJS. Ogranicza powtarzające się żądania do publicznych interfejsów API i/lub punktów końcowych, takich jak resetowanie haseł, logowanie użytkowników itp.

Zainstaluj wymagane zależności, uruchamiając:

npm zainstalować ekspres-ekspresowy-limit

Krok 2: Tworzenie aplikacji ekspresowej

Musisz utworzyć podstawowy serwer Express, który nasłuchuje żądań wysyłanych do Twojej aplikacji.

Najpierw utwórz index.js plik w katalogu głównym projektu. Będzie to plik wejściowy dla Twojej aplikacji.

Następnie dodaj następujący kod do swojego index.js plik:

// index.js
stały ekspres = wymagać("wyrazić");
stały aplikacja = ekspres();
stały port = proces.env. PORT || 3000

app.listen (port, () => {
konsola.dziennik(`Aplikacja uruchomiona na porcie ${port}`);
});

Ten kod importuje wyrazić i tworzy aplikację Express, wywołując express() i przechowując jej zwracaną wartość w aplikacja zmienny. Następnie nasłuchuje ruchu na porcie 3000 dzwoniąc do słuchać metoda na aplikacja obiekt.

Krok 3: Tworzenie programów obsługi tras

Następnie utwórz kilka programów obsługi tras, na których możesz zaimplementować rozwiązanie ograniczające szybkość.

Najpierw utwórz folder, trasy w katalogu głównym projektu, uruchamiając:

trasy mkdir

Utwórz plik, trasy.js, w folderze tras i dodaj następujący kod:

stały ekspres = wymagać("wyrazić");
stały router = ekspres. Router();

router.get("/", (wymagane, odp.) => {
res.send({ wiadomość: "Witam, to jest żądanie GET" });
});

router.post("/add-demo", (wymagane, odp.) => {
res.status (201).send({ wiadomość: "Zasób został utworzony pomyślnie" });
});

router.put("/update-demo", (wymagane, odp.) => {
res.status (201).send({ wiadomość: "Zasób zaktualizowany pomyślnie" });
});

moduł.eksport = router;

Ten kod importuje wyrazić, nazywa Router metoda włączona wyrazići przechowuje wartość w zmiennej, router. The Router Metoda pozwala tworzyć modułowe, montowalne programy obsługi tras. Możesz utworzyć programy obsługi tras dla DOSTAWAĆ poprosić o "/", a POCZTA poprosić o "/add-demo”i a POŁOŻYĆ poprosić o "/update-demo”. Na koniec wyeksportuj router zmienny.

Następnie zaimportuj router zmienna w twoim index.js plik:

// index.js
stały trasy = wymagać("./trasy/trasy");

Następnie użyj go jako oprogramowania pośredniczącego w pliku index.js:

// index.js
aplikacja.posługiwać się(trasy);

Pamiętaj, aby umieścić powyższy blok kodu przed app.listen połączenie.

Krok 4: Wdrażanie ograniczania szybkości

Najpierw utwórz „oprogramowanie pośrednie” w katalogu głównym projektu, uruchamiając:

oprogramowanie pośredniczące mkdir

Następnie utwórz plik o nazwie „rate-limiter.js” wewnątrz katalogu oprogramowania pośredniego. Dodaj następujący kod do tego pliku:

// rate-limiter.js
stały Ogranicznik szybkości = wymagać("limit stawki ekspresowej");

stały ogranicznik = limiter szybkości({
max: 5,
oknoMS: 10000, // 10 sekund
wiadomość: "Możesz'W tej chwili nie składać więcej próśb. Spróbuj ponownie później",
});

moduł.eksport = ogranicznik

The rateLimiter funkcja przyjmuje obiekt konfiguracyjny z warunkami ograniczającymi liczbę żądań.

Właściwości w powyższym obiekcie konfiguracyjnym to:

  • maks: Ta właściwość musi być zawsze numer lub funkcja zwracająca liczbę. Reprezentuje maksymalną liczbę żądań, które użytkownik może złożyć w określonym przedziale czasowym. Jeśli ta właściwość nie jest ustawiona w obiekcie konfiguracyjnym, domyślnie jest to 5.
  • WindowsMS: Ta właściwość powinna zawsze być liczbą. Reprezentuje ramy czasowe, w których kilka żądań jest dozwolonych w milisekundy. Jeśli ta właściwość nie jest ustawiona w obiekcie konfiguracyjnym, wartość domyślna wynosi 60000 milisekund (jedna minuta).
  • wiadomość: Ta właściwość może być strunowy, obiekt JSON lub dowolna inna wartość obsługiwana przez Odpowiedź Express.send metoda. Jeśli ta właściwość nie jest ustawiona w obiekcie konfiguracyjnym, domyślnie przyjmuje wartość „Zbyt wiele żądań. Spróbuj ponownie później."

Następnie funkcja sprawdzi, czy nie występują powtarzające się żądania do Twojej aplikacji. Jeśli użytkownik przekroczy limit (maks, 5) w ramach czasowych (oknoMS, 10s), spowoduje to zablokowanie żądania. Zgłosi również błąd „Zbyt wiele żądań” z kodem stanu 429.

Na koniec zaimportuj funkcję ogranicznika do swojego index.js plik i zastosuj go jako globalne oprogramowanie pośredniczące w swojej aplikacji. Zrób to, umieszczając użycie aplikacji (limiter) nad oprogramowaniem pośredniczącym tras. To stosuje rozwiązanie ograniczające szybkość do wszystkich tras aplikacji.

aplikacja.posługiwać się(ogranicznik);

Określone trasy ograniczające prędkość

Możesz również zastosować ograniczenie stawek do określonych tras. Możesz je skonfigurować osobno, aby odrzucać żądania złożone w różnych ramach czasowych, wyświetlać inną wiadomość itp.

Załóżmy na przykład, że implementujesz w swojej aplikacji trasę logowania użytkownika. Może być konieczne dodanie konfiguracji ograniczającej szybkość dla trasy logowania, która różni się od konfiguracji używanej przez inne trasy.

Najpierw musisz usunąć ogranicznik jako oprogramowanie pośredniczące na poziomie aplikacji i zastosuj je, ponieważ w ExpressJS nie ma wbudowanego systemu filtrowania oprogramowania pośredniego. Tak więc nawet jeśli dodasz do trasy określone rozwiązanie ograniczające szybkość, globalne oprogramowanie pośredniczące nadal będzie działać na tej trasie.

Następnie utwórz nową konfigurację ograniczania szybkości w swoim rate-limiter.js plik i wyeksportuj go.

stały signInLimiter = rateLimiter({
max: 3,
oknoMS: 10000, //10 sekund
wiadomość: "Zbyt wiele prób logowania. Spróbuj ponownie później."
})

moduł.eksport = {
ogranicznik,
signInLimiter
}

The signInLimiter obiekt konfiguracyjny ma różną liczbę maks żądania i inny komunikat o błędzie z ogólnego ogranicznika szybkości.

Na koniec zaktualizuj swój router.js plik z poniższym blokiem kodu:

// router.js
stały ekspres = wymagać("wyrazić");
stały router = ekspres. Router();
stały {limiter, signInLimiter} = wymagać(„../oprogramowanie pośrednie/ogranicznik szybkości”)

router.get("/sign-in", signInLimiter, (req, res, next) => {
res.send({ wiadomość: "Witam, to jest żądanie GET" });
});

router.posługiwać się(ogranicznik)

router.post("/post", (wymagane, odp.) => {
res.status (201).send({ wiadomość: "Zasób został utworzony pomyślnie" });
});

router.put("/put", (wymagane, odp.) => {
res.status (201).send({ wiadomość: "Zasób zaktualizowany pomyślnie" });
});

moduł.eksport = router;

W powyższym bloku kodu zaimportowałeś ogranicznik oraz signInLimiter. Potem złożyłeś podanie signInLimiter jako specyficzny ogranicznik stawki do „/sign-in" trasa.

Wreszcie, umieszczając router.use (limiter) nad pozostałymi trasami zastosowałeś limiter jako ogranicznik szybkości dla pozostałych tras.

Znaczenie ograniczania szybkości

Ograniczanie szybkości zmniejsza obciążenie serwera WWW, unikając konieczności przetwarzania zbyt wielu żądań naraz. Obniża aktywność botów, chroni przed atakami typu Denial of Service (DoS) i zapobiega atakom typu brute-force.