关于 rate-limiting-abuse-protection
rate-limiting-abuse-protection 是用于保护 API 的限流与滥用防护技能,适合需要控制请求频率的开发者。它介绍多种限流策略,以及按用户、IP 或 Redis 状态进行检查的实现方式。
主要功能
- 01支持固定窗口、滑动窗口等策略
- 02提供 Express 限流中间件示例
- 03通过 Redis 执行限流检查
- 04按用户或 IP 限制请求
- 05返回限流响应头
适用场景
- 01限制不同 API 端点的请求频率
- 02为用户设置单独的请求配额
- 03拦截可疑 IP 并记录违规行为
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ patricio0312rev/ skills --skill rate-limiting-abuse-protection安装后在 Claude Code 中输入/rate-limiting-abuse-protection确认已加载。
详细介绍
速率限制与滥用防护
通过智能速率限制保护 API 免遭滥用。
速率限制策略
固定窗口:每小时 100 个请求
滑动窗口:更加准确,可防止突发请求
令牌桶:允许在限制范围内突发请求
漏桶:平滑请求速率
实现(Express)
import rateLimit from "express-rate-limit";
// Global rate limit
const globalLimiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15 minutes
max: 100, // 100 requests per window
message: "Too many requests, please try again later",
standardHeaders: true, // Return rate limit info in headers
legacyHeaders: false,
});
// Stricter limit for auth endpoints
const authLimiter = rateLimit({
windowMs: 15 * 60 * 1000,
max: 5, // Only 5 attempts
skipSuccessfulRequests: true, // Don't count successful logins
});
app.use("/api/", globalLimiter);
app.use("/api/auth/login", authLimiter);
基于 Redis 的速率限制
import Redis from "ioredis";
const redis = new Redis();
export const checkRateLimit = async (
key: string,
max: number,
window: number
): Promise<{ allowed: boolean; remaining: number }> => {
const now = Date.now();
const windowStart = now - window;
await redis
.multi()
.zremrangebyscore(key, 0, windowStart)
.zadd(key, now, `${now}`)
.zcard(key)
.expire(key, Math.ceil(window / 1000))
.exec();
const count = await redis.zcard(key);
return {
allowed: count <= max,
remaining: Math.max(0, max - count),
};
};
基于用户的速率限制
export const userRateLimit = (max: number, window: number) => {
return async (req, res, next) => {
if (!req.user) return next();
const key = `rate_limit:user:${req.user.id}`;
const result = await checkRateLimit(key, max, window);
res.setHeader("X-RateLimit-Limit", max);
res.setHeader("X-RateLimit-Remaining", result.remaining);
if (!result.allowed) {
return res.status(429).json({
error: "Rate limit exceeded",
retryAfter: window / 1000,
});
}
next();
};
};
基于 IP 的防护
// Block suspicious IPs
const ipBlocklist = new Set<string>();
export const checkIPReputation = async (ip: string): Promise<boolean> => {
if (ipBlocklist.has(ip)) return false;
// Check against threat intelligence API
const reputation = await checkThreatIntel(ip);
if (reputation.isMalicious) {
ipBlocklist.add(ip);
return false;
}
return true;
};
响应头
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 95
X-RateLimit-Reset: 1640000000
Retry-After: 3600
最佳实践
- 为不同端点设置不同的限制
- 对开销较大的操作设置更低的限制
- 对内部服务跳过速率限制
- 返回有帮助的错误消息
- 记录违反速率限制的情况
- 监控滥用模式
- 将可信 IP 列入允许列表
输出检查清单
- 速率限制中间件
- 按路由设置策略
- 基于用户的限制
- 基于 IP 的限制
- 速率限制响应头
- 安全的错误响应
- 可观测性/日志记录
- 为内部服务提供绕过机制
评论
支持 Markdown