mcpField
R
rate-limiting-abuse-protection

rate-limiting-abuse-protection

github.com/patricio0312rev安全63320 次安装41 周前更新
代码仓库

关于 rate-limiting-abuse-protection

rate-limiting-abuse-protection 是用于保护 API 的限流与滥用防护技能,适合需要控制请求频率的开发者。它介绍多种限流策略,以及按用户、IP 或 Redis 状态进行检查的实现方式。

主要功能

  1. 01支持固定窗口、滑动窗口等策略
  2. 02提供 Express 限流中间件示例
  3. 03通过 Redis 执行限流检查
  4. 04按用户或 IP 限制请求
  5. 05返回限流响应头

适用场景

  1. 01限制不同 API 端点的请求频率
  2. 02为用户设置单独的请求配额
  3. 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