📜  express-rate-limit nodejs - Javascript (1)

📅  最后修改于: 2023-12-03 14:41:04.778000             🧑  作者: Mango

Express-rate-limit Node.js

介绍

express-rate-limit 是一个用于 Node.js 应用程序的中间件,可以通过限制 IP 地址在指定时间窗口内发送的请求的数量来增强应用程序的安全性。这个库基于 ratelimiter 库,不但支持基本的限流功能,还能够设置不同的规则,比如不同的限流速率和处理程序。

安装

使用 npm 安装:

npm install express-rate-limit
使用

在应用程序中包含库:

const rateLimit = require('express-rate-limit');
基本设置

将要限流的路由使用中间件:

// 创建一个每分钟5次请求的限流器
const limiter = rateLimit({
  windowMs: 60 * 1000, // 1分钟
  max: 5 // 每分钟最多5个请求
});

// 应用到对应的路由上
app.use('/api/', limiter);
自定义设置

可以针对不同的路由使用不同的限流规则,例如

  • /api/: 每分钟最多5次请求
  • /auth/: 每小时最多3次请求
// 限制 /api/ 请求每分钟最多5次
const apiLimiter = rateLimit({
  windowMs: 60 * 1000,
  max: 5,
  message: 'Too many requests from this IP, please try again in 1 minute.'
});

// 限制 /auth/ 请求每小时最多3次
const authLimiter = rateLimit({
  windowMs: 60 * 60 * 1000,
  max: 3,
  message: 'Too many requests from this IP, please try again in 1 hour.'
});

// 应用到对应的路由上
app.use('/api/', apiLimiter);
app.use('/auth/', authLimiter);

当达到限流时,会返回一个 429 状态码并包含自定义消息。

存储

默认情况下,限流器存储使用内存存储,但也可以使用其他存储。常见的存储包括 Redis 和 MongoDB。在设置存储之前,需要安装相应的模块。

Redis:

npm i redis
const redis = require('redis');
const redisClient = redis.createClient(6379, '127.0.0.1');
const limiter = rateLimit({
  windowMs: 60 * 1000,
  max: 5,
  store: new RateLimitRedis({
    client: redisClient
  })
});

MongoDB:

npm i mongoose
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/rate-limit', {
  useNewUrlParser: true,
  useUnifiedTopology: true,
  useCreateIndex: true
});

const limiter = rateLimit({
  windowMs: 60 * 1000,
  max: 5,
  store: new MongooseStore({
    modelRateLimit: mongoose.model('RateLimit', new mongoose.Schema({
      ip: String,
      endpoint: String,
      createdAt: Date
    }))
  })
});
结语

express-rate-limit 提供了一种简单而有效的方法来增强应用程序的安全性。它可以很好地帮助程序员限制对程序的恶意攻击。当然,在使用时还需要结合其他措施来保证程序安全性。