Hız sınırlama, bir ağdaki trafiği kontrol etmek için kullanabileceğiniz bir stratejidir. Bir kullanıcının belirli bir zaman diliminde yapabileceği istek sayısını sınırlar.

Çeşitli oran sınırlama algoritmaları mevcuttur ve bunların her biri kendi ödünleşimlerine sahiptir. Basit ve popüler bir yöntem, isteklerin IP adreslerini izlemek ve istekler arasında ne kadar zaman geçtiğini kontrol etmektir. Sistem daha sonra IP adresi sınırın izin verdiği istek sayısını aşarsa bir isteği reddedebilir.

Hız sınırlamaya yönelik bu yaklaşımı, yalnızca birkaç adımda NodeJS-Express uygulamasında oluşturmak kolaydır.

1. Adım: Bir Geliştirme Ortamı Ayarlama

İlk olarak, bir Express uygulaması oluşturmanız ve başlatmanız gerekir.

Aşağıdakileri çalıştırarak bir proje dizini oluşturarak başlayın:

mkdir ekspres uygulaması

Ardından şu dizini çalıştırarak girin:

CD ekspres uygulama

Ardından, başlat npm, düğüm paketi yöneticisi, ve bir oluştur paket.json çalıştırarak uygulamanızda dosya:

npm başlangıç ​​-y

bu -y bayrak seninkini yaratacak paket.json tüm varsayılan ayarlarla dosya.

instagram viewer

Ardından, bazı bağımlılıklar yüklemeniz gerekecek. Bu öğretici için gereken bağımlılıklar şunlardır:

  • ExpressJS: ExpressJS bir NodeJS çerçevesidir web ve mobil uygulamalar için sağlam bir dizi özellik sağlar. NodeJS ile arka uç uygulamaları oluşturma sürecini basitleştirir.
  • Ekspres Oran Sınırı: Ekspres hız sınırı, ExpressJS için hız sınırlayıcı bir ara katman yazılımıdır. Parola sıfırlama, kullanıcı oturum açma vb. gibi genel API'lere ve/veya uç noktalara yönelik tekrarlanan istekleri sınırlar.

Aşağıdakileri çalıştırarak gerekli bağımlılıkları kurun:

npm Yüklemek ekspres hızlı-sınır

2. Adım: Bir Ekspres Uygulama Oluşturma

Uygulamanıza yapılan istekleri dinleyen temel bir Express sunucusu oluşturmanız gerekir.

İlk olarak, bir index.js projenizin kök dizinindeki dosya. Bu, başvurunuz için giriş dosyası olacaktır.

Ardından, aşağıdaki kodu dosyanıza ekleyin index.js dosya:

// index.js
const ifade = gerekmek("ifade etmek");
const uygulama = ekspres();
const bağlantı noktası = işlem.env. LİMAN || 3000

app.listen (bağlantı noktası, () => {
konsol.kayıt(`Uygulama bağlantı noktasında çalışıyor ${port}`);
});

Bu kod içe aktarır ifade etmek ve express()'i çağırarak ve dönüş değerini uygulama değişken. Daha sonra bağlantı noktasındaki trafiği dinler 3000 arayarak dinlemek üzerindeki yöntem uygulama nesne.

3. Adım: Rota İşleyicileri Oluşturma

Ardından, hız sınırlama çözümünü uygulayabileceğiniz bazı rota işleyicileri oluşturun.

İlk önce, aşağıdakileri çalıştırarak projenizin kök dizininde bir klasör, yollar oluşturun:

mkdir yolları

Dosya oluştur, route.js, rotalar klasörünüzün içine ve aşağıdaki kodu ekleyin:

const ifade = gerekmek("ifade etmek");
const yönlendirici = ekspres. Yönlendirici();

yönlendirici.get("/", (gereklilik, öz) => {
res.send({ mesaj: "Merhaba, bu bir GET isteğidir" });
});

yönlendirici.post("/add-demo", (gereklilik, öz) => {
res.status (201).send({ mesaj: "Kaynak başarıyla oluşturuldu" });
});

yönlendirici.put("/update-demo", (gereklilik, öz) => {
res.status (201).send({ mesaj: "Kaynak başarıyla güncellendi" });
});

modül.ihracat = yönlendirici;

Bu kod içe aktarır ifade etmek, çağırır yönlendirici yöntem ifade etmekve değeri bir değişkende saklar, yönlendirici. bu yönlendirici method modüler, monte edilebilir rota işleyicileri oluşturmanıza olanak sağlar. için rota işleyicileri oluşturabilirsiniz. ALMAK istemek"/", a İLETİ istemek"/add-demo” ve bir KOY istemek"/update-demo”. Son olarak, dışa aktarın yönlendirici değişken.

Ardından, içe aktarın yönlendirici senin değişken index.js dosya:

// index.js
const rotalar = gerekmek("./routes/routes");

Ardından, bunu index.js dosyanızda bir ara katman yazılımı olarak kullanın:

// index.js
uygulama.kullanmak(rotalar);

Yukarıdaki kod bloğunu önce yerleştirdiğinizden emin olun. uygulama.dinle aramak.

Adım 4: Hız Sınırlamasının Uygulanması

İlk önce bir "ara katman yazılımı” klasörünü çalıştırarak projenizin kök dizininde:

mkdir ara katman yazılımı

Ardından “adlı bir dosya oluşturun.oran-sınırlayıcı.js” ara katman dizini içinde. Bu dosyaya aşağıdaki kodu ekleyin:

// hız sınırlayıcı.js
const oranSınırlayıcı = gerekmek("ekspres-oran-limit");

const sınırlayıcı = oran Sınırlayıcı({
maksimum: 5,
pencereMS: 10000, // 10 saniye
İleti: "Yapabilirsiniz'Şu anda başka istekte bulunma. Daha sonra tekrar deneyin",
});

modül.ihracat = sınırlayıcı

bu oran Sınırlayıcı işlev, istek sayısını sınırlama koşullarıyla bir yapılandırma nesnesi alır.

Yukarıdaki yapılandırma nesnesindeki özellikler şunlardır:

  • maksimum: Bu özellik her zaman bir sayı veya bir sayı döndüren bir işlev. Bir kullanıcının belirli bir zaman diliminde yapabileceği maksimum istek sayısını temsil eder. Bu özellik yapılandırma nesnesinde ayarlanmazsa, varsayılan olarak 5.
  • windowsMS: Bu özellik her zaman bir sayı olmalıdır. Birkaç isteğe izin verildiği zaman dilimini temsil eder. milisaniye. Bu özellik yapılandırma nesnesinde ayarlanmazsa, varsayılan olarak 60000 milisaniye (bir dakika) olur.
  • İleti: Bu özellik bir sicim, bir JSON nesnesi veya tarafından desteklenen herhangi bir değer Express'in yanıtı.send yöntem. Bu özellik yapılandırma nesnesinde ayarlanmazsa, varsayılan olarak "Çok fazla istek. Lütfen daha sonra tekrar deneyiniz."

İşlev daha sonra başvurunuza gelen tekrarlanan istekleri kontrol edecektir. Bir kullanıcı sınırı aşarsa (maksimum, 5) zaman çerçevesi içinde (pencereMS, 10s), isteği engeller. Ayrıca durum koduyla birlikte "Çok Fazla İstek" hatası verir. 429.

Son olarak, sınırlayıcı işlevini index.js dosyalayın ve uygulamanızda global bir ara katman yazılımı olarak uygulayın. Bunu yerleştirerek yapın app.use (sınırlayıcı) yolları ara katman yazılımının üstünde. Bu, hız sınırlayıcı çözümü uygulamanızın tüm rotalarına uygular.

uygulama.kullanmak(sınırlayıcı);

Hız Sınırlayıcı Spesifik Rotalar

Belirli rotalara hız sınırlaması da uygulayabilirsiniz. Bunları farklı bir zaman diliminde yapılan istekleri reddetmek, farklı bir mesaj görüntülemek vb. için ayrı ayrı yapılandırabilirsiniz.

Örneğin, uygulamanızda bir kullanıcı oturum açma yolu uyguladığınızı varsayalım. Oturum açma yolu için diğer yollar tarafından kullanılan yapılandırmadan farklı bir hız sınırlayıcı yapılandırma eklemeniz gerekebilir.

İlk önce, kaldırmanız gerekecek sınırlayıcı uygulama düzeyinde bir ara katman yazılımı olarak kullanın ve ExpressJS'de yerleşik bir ara katman yazılımı filtre sistemi olmadığı için uygulayın. Bu nedenle, bir rotaya belirli bir hız sınırlayıcı çözüm ekleseniz bile, global ara katman yazılımı yine de o rotada çalışır.

Ardından, cihazınızda yeni bir hız sınırlayıcı yapılandırma oluşturun. oran-sınırlayıcı.js dosya ve dışa aktarın.

const signInLimiter = oranLimiter({
maksimum: 3,
pencereMS: 10000, //10 saniye
İleti: "Çok fazla oturum açma denemesi. Daha sonra tekrar deneyin."
})

modül.ihracat = {
sınırlayıcı,
SignInLimiter
}

bu SignInLimiter yapılandırma nesnesinin farklı sayıda maksimum istekleri ve genel hız sınırlayıcıdan farklı bir hata mesajı.

Son olarak, güncelleyin yönlendirici.js Aşağıdaki kod bloğuna sahip dosya:

// yönlendirici.js
const ifade = gerekmek("ifade etmek");
const yönlendirici = ekspres. Yönlendirici();
const {sınırlayıcı, signInLimiter} = gerekmek("../middleware/rate-limiter")

yönlendirici.get("/sign-in", signInLimiter, (gerekli, res, sonraki) => {
res.send({ mesaj: "Merhaba, bu bir GET isteğidir" });
});

yönlendirici.kullanmak(sınırlayıcı)

yönlendirici.post("/post", (gereklilik, öz) => {
res.status (201).send({ mesaj: "Kaynak başarıyla oluşturuldu" });
});

yönlendirici.put("/put", (gereklilik, öz) => {
res.status (201).send({ mesaj: "Kaynak başarıyla güncellendi" });
});

modül.ihracat = yönlendirici;

Yukarıdaki kod bloğunda, içe aktardığınız sınırlayıcı ve SignInLimiter. sonra başvurdun SignInLimiter " için belirli bir hız sınırlayıcı olarak/sign-in" güzergah.

Son olarak yerleştirerek router.use (sınırlayıcı) diğer rotaların üzerinde, rotaların geri kalanı için hız sınırlayıcı olarak sınırlayıcı uyguladınız.

Hız Sınırlamasının Önemi

Hız sınırlaması, aynı anda çok fazla isteği işlemek zorunda kalmadan web sunucunuzdaki yükü azaltır. Bot etkinliğini azaltır, sizi Hizmet Reddi (DoS) saldırılarından korur ve kaba kuvvet saldırılarını önler.