📅  最后修改于: 2023-12-03 14:41:04.778000             🧑  作者: Mango
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 提供了一种简单而有效的方法来增强应用程序的安全性。它可以很好地帮助程序员限制对程序的恶意攻击。当然,在使用时还需要结合其他措施来保证程序安全性。