Omezení rychlosti je strategie, kterou můžete použít k řízení provozu v síti. Omezuje počet požadavků, které může uživatel provést v určitém časovém rámci.

Existují různé algoritmy omezující rychlost, z nichž každý má své vlastní kompromisy. Jednou z jednoduchých a populárních metod je sledovat IP adresy požadavků a kontrolovat, kolik času uplyne mezi požadavky. Systém pak může požadavek odmítnout, pokud jeho IP adresa překročí povolený počet požadavků.

Tento přístup k omezení rychlosti lze snadno zabudovat do aplikace NodeJS-Express pomocí několika kroků.

Krok 1: Nastavení vývojového prostředí

Nejprve budete muset vytvořit a inicializovat aplikaci Express.

Začněte vytvořením adresáře projektu spuštěním:

expresní aplikace mkdir

Poté zadejte tento adresář spuštěním:

CD expresní aplikace

Dále inicializujte npm, správce balíčků uzlů, a vytvořit a package.json soubor ve vaší aplikaci spuštěním:

npm init -y

The -y vlajka vytvoří váš package.json soubor se všemi výchozími nastaveními.

Dále budete muset nainstalovat některé závislosti. Závislosti požadované pro tento tutoriál jsou:

instagram viewer
  • ExpressJS: ExpressJS je framework NodeJS který poskytuje robustní sadu funkcí pro webové a mobilní aplikace. Zjednodušuje proces vytváření backendových aplikací s NodeJS.
  • Expresní rychlostní limit: Express rate limit je middleware omezující rychlost pro ExpressJS. Omezuje opakované požadavky na veřejná rozhraní API a/nebo koncové body, jako je resetování hesla, přihlášení uživatelů atd.

Nainstalujte požadované závislosti spuštěním:

npm Nainstalujte expresní expresní sazba-omezit

Krok 2: Vytvoření expresní aplikace

Budete si muset vytvořit základní expresní server, který bude naslouchat požadavkům odeslaným do vaší aplikace.

Nejprve vytvořte index.js soubor v kořenovém adresáři vašeho projektu. Toto bude vstupní soubor pro vaši aplikaci.

Dále přidejte následující kód do svého index.js soubor:

// index.js
konst vyjádřit = vyžadovat("vyjádřit");
konst app = express();
konst port = proces.env. PORT || 3000

app.listen (port, () => {
řídicí panel.log(`Aplikace běžící na portu ${port}`);
});

Tento kód importuje vyjádřit a vytvoří aplikaci Express voláním express() a uložením její návratové hodnoty do aplikace variabilní. Poté naslouchá provozu na portu 3000 zavoláním na poslouchat metoda na aplikace objekt.

Krok 3: Vytvoření obslužných rutin tras

Dále vytvořte některé obslužné nástroje tras, na kterých můžete implementovat řešení omezující rychlost.

Nejprve vytvořte složku routes v kořenovém adresáři projektu spuštěním:

trasy mkdir

Vytvořte soubor, routes.js, do složky tras a přidejte následující kód:

konst vyjádřit = vyžadovat("vyjádřit");
konst router = expres. Router();

router.get("/", (req, res) => {
res.send({ zpráva: "Dobrý den, toto je požadavek GET" });
});

router.post("/add-demo", (req, res) => {
res.status (201).send({ zpráva: "Zdroj byl úspěšně vytvořen" });
});

router.put("/update-demo", (req, res) => {
res.status (201).send({ zpráva: "Zdroj byl úspěšně aktualizován" });
});

modul.exportů = router;

Tento kód importuje vyjádřit, volá Směrovač metoda zapnuta vyjádřita uloží hodnotu do proměnné, router. The Směrovač metoda umožňuje vytvořit modulární, připojitelné obslužné rutiny trasy. Můžete vytvořit obslužné rutiny tras pro a DOSTAT požadavek na "/“, a POŠTA požadavek na "/add-demo“ a a DÁT požadavek na "/update-demo”. Nakonec exportujte router variabilní.

Dále importujte router proměnná ve vašem index.js soubor:

// index.js
konst trasy = vyžadovat(./routes/routes");

Poté jej použijte jako middleware v souboru index.js:

// index.js
aplikace.použití(trasy);

Ujistěte se, že jste umístili blok kódu výše před app.poslouchat volání.

Krok 4: Implementace omezení sazby

Nejprve vytvořte „middleware” složku v kořenovém adresáři vašeho projektu spuštěním:

middleware mkdir

Poté vytvořte soubor s názvem „rate-limiter.js“ uvnitř adresáře middlewaru. Přidejte do tohoto souboru následující kód:

// rate-limiter.js
konst rateLimiter = vyžadovat("expres-rate-limit");

konst omezovač = rateLimiter({
max: 5,
windowsMS: 10000, // 10 sekund
zpráva: "Můžeš'v tuto chvíli nepodáváte žádné další požadavky. Zkuste to později",
});

modul.exportů = omezovač

The rateLimiter funkce přebírá konfigurační objekt s podmínkami pro omezení počtu požadavků.

Vlastnosti v objektu konfigurace výše jsou:

  • max: Tato vlastnost musí být vždy a číslo nebo funkce, která vrací číslo. Představuje maximální počet požadavků, které může uživatel provést ve stanoveném časovém rámci. Pokud tato vlastnost není nastavena v konfiguračním objektu, je výchozí hodnotou 5.
  • WindowsMS: Tato vlastnost by měla být vždy číslo. Představuje časový rámec, ve kterém je povoleno několik požadavků milisekundy. Pokud tato vlastnost není nastavena v konfiguračním objektu, výchozí hodnota je 60 000 milisekund (jedna minuta).
  • zpráva: Tato vlastnost může být a tětiva, objekt JSON nebo jakákoli jiná hodnota podporovaná Odpověď Expressu.odeslat metoda. Pokud tato vlastnost není nastavena v konfiguračním objektu, výchozí hodnota je „Příliš mnoho požadavků. Prosím zkuste to znovu později."

Funkce pak zkontroluje opakované požadavky na vaši aplikaci. Pokud uživatel překročí limit (max, 5) v časovém rámci (windowsMS, 10s), zablokuje požadavek. Vyvolá také chybu „Příliš mnoho požadavků“ se stavovým kódem 429.

Nakonec importujte funkci omezovače do svého index.js a použít jej jako globální middleware ve vaší aplikaci. Udělejte to umístěním app.use (omezovač) nad middlewarem tras. Toto aplikuje řešení omezující rychlost na všechny trasy vaší aplikace.

aplikace.použití(omezovač);

Konkrétní trasy s omezením sazby

Můžete také použít omezení sazeb na konkrétní trasy. Můžete je nakonfigurovat samostatně, aby odmítaly požadavky podané v jiném časovém rámci, zobrazovaly jinou zprávu atd.

Předpokládejme například, že ve své aplikaci implementujete trasu pro přihlášení uživatele. Možná budete muset přidat konfiguraci omezující rychlost pro trasu přihlášení, která se liší od konfigurace používané ostatními trasami.

Nejprve budete muset odstranit omezovač jako middleware na úrovni aplikace a aplikujte jej, protože v ExpressJS není žádný vestavěný systém filtrování middlewaru. Takže i když do trasy přidáte konkrétní řešení omezující rychlost, globální middleware by stále běžel na této trase.

Dále ve svém účtu vytvořte novou konfiguraci omezující rychlost rate-limiter.js soubor a exportujte jej.

konst signInLimiter = rateLimiter({
max: 3,
windowsMS: 10000, //10 sekund
zpráva: "Příliš mnoho pokusů o přihlášení. Zkuste to později."
})

modul.exportů = {
omezovač,
signInLimiter
}

The signInLimiter konfigurační objekt má jiný počet max požadavky a jinou chybovou zprávu z obecného omezovače rychlosti.

Nakonec aktualizujte svůj router.js soubor s blokem kódu níže:

// router.js
konst vyjádřit = vyžadovat("vyjádřit");
konst router = expres. Router();
konst {limiter, signInLimiter} = vyžadovat(../middleware/rate-limiter)

router.get("/sign-in", signInLimiter, (req, res, next) => {
res.send({ zpráva: "Dobrý den, toto je požadavek GET" });
});

router.použití(omezovač)

router.post("/post", (req, res) => {
res.status (201).send({ zpráva: "Zdroj byl úspěšně vytvořen" });
});

router.put("/put", (req, res) => {
res.status (201).send({ zpráva: "Zdroj byl úspěšně aktualizován" });
});

modul.exportů = router;

Ve výše uvedeném bloku kódu jste importovali omezovač a signInLimiter. Pak jste se přihlásili signInLimiter jako konkrétní omezovač sazeb na „/sign-in“trasa.

Nakonec umístěním router.use (omezovač) nad zbytkem tras jste použili omezovač jako omezovač rychlosti pro zbytek tras.

Význam omezení sazeb

Omezení rychlosti snižuje zatížení vašeho webového serveru tím, že nemusíte zpracovávat příliš mnoho požadavků najednou. Snižuje aktivitu botů, chrání vás před útoky DoS (Denial of Service) a zabraňuje útokům hrubou silou.