网站首页 网站源码

为 RejectBots 中间件添加了基于IP的智能限流机制,可以有效防止同一IP频繁触发拦截规则,提高系统安全性和稳定性。
请求流程:
客户端请求
↓
IP限流检查 (第一层)
↓
黑名单检查 (第二层)
↓
User-Agent检查 (第三层)
↓
自定义规则检查 (第四层)
↓
正常业务处理
private static readonly IpRateLimitConfig RateLimitConfig = new()
{
WindowSizeMinutes = 5, // 时间窗口:5分钟
MaxRequestsPerWindow = 100, // 每个时间窗口最大请求数
MaxBlocksPerWindow = 3, // 每个时间窗口最大拦截次数
BlockDurationMinutes = 30, // IP被阻止的持续时间:30分钟
CleanupIntervalMinutes = 60 // 清理过期记录的间隔:60分钟
};
| 参数 | 默认值 | 说明 | 建议调整 |
|---|---|---|---|
WindowSizeMinutes | 5分钟 | 统计时间窗口 | 根据业务访问模式调整 |
MaxRequestsPerWindow | 100次 | 窗口内最大请求数 | 正常用户峰值的1.5-2倍 |
MaxBlocksPerWindow | 3次 | 窗口内最大拦截次数 | 较为严格,可适当调整 |
BlockDurationMinutes | 30分钟 | 封禁持续时间 | 根据业务容忍度调整 |
CleanupIntervalMinutes | 60分钟 | 清理间隔 | 根据内存使用情况调整 |
条件: 5分钟内请求次数 > 100
行为: 立即拦截并记录
日志: "IP访问频率超限"
条件: 5分钟内被拦截次数 ≥ 3
行为: 封禁IP 30分钟
日志: "IP限流阻止访问"
黑名单拦截 → 记录IP拦截次数
空User-Agent → 记录IP拦截次数
自定义规则拦截 → 记录IP拦截次数
var stats = RejectBots.GetIpRateLimitStats();
Console.WriteLine($"总跟踪IP: {stats.TotalTrackedIps}");
Console.WriteLine($"被阻止IP: {stats.BlockedIps}");
Console.WriteLine($"活跃IP: {stats.ActiveIps}");
// IP频率超限
logger.LogWarning("IP访问频率超限,IP:{ClientIp}, RequestPath:{RequestPath}",
clientIp, httpContext.Request.Path);
// IP被封禁
logger.LogWarning("IP限流阻止访问,IP:{ClientIp}, RequestPath:{RequestPath}",
clientIp, httpContext.Request.Path);
// 其他拦截增强
logger.LogInformation("黑名单拦截,RequestMethod:{RequestMethod}, RequestPath:{RequestPath}",
httpContext.Request.Method, httpContext.Request.Path);
场景: 自动化工具频繁扫描敏感路径
效果: 5分钟内超过100次请求自动封禁
示例: /admin/*, /.env, /wp-admin/*
场景: 爬虫忽略robots.txt大量抓取
效果: 被拦截3次后自动封禁30分钟
示例: 空User-Agent、违规User-Agent
场景: 单个IP短时间内大量调用API
效果: 超过频率限制立即阻止
示例: /api/*, 批量数据请求
// 在 RejectBots 类中修改默认配置
private static readonly IpRateLimitConfig RateLimitConfig = new()
{
WindowSizeMinutes = 10, // 调整为10分钟窗口
MaxRequestsPerWindow = 200, // 调整为200次请求
MaxBlocksPerWindow = 5, // 调整为5次拦截
BlockDurationMinutes = 60, // 调整为60分钟封禁
CleanupIntervalMinutes = 120 // 调整为120分钟清理
};
// appsettings.json
{
"IpRateLimit": {
"WindowSizeMinutes": 5,
"MaxRequestsPerWindow": 100,
"MaxBlocksPerWindow": 3,
"BlockDurationMinutes": 30,
"CleanupIntervalMinutes": 60
}
}
ConcurrentDictionary预估内存使用 (1000个活跃IP):
- 基础结构: ~50KB
- IP记录: ~100KB
- 总计: ~150KB
IP限流机制为 RejectBots 中间件提供了强大的防护能力:
通过这个实现,你的Web应用将获得更强的安全防护能力!🚀
