lovart3/lib/security/ip-blocklist.ts
Your Name a8abed6b5b feat: 添加多层安全防护机制
- 添加速率限制中间件,防止API滥用和DDoS攻击
- 添加可疑请求检测,基于行为模式识别攻击
- 添加输入清理和验证,防止命令注入和XSS攻击
- 更新middleware.ts,集成所有安全功能
- 添加fail2ban安装脚本,防止SSH暴力破解
- 不依赖IP黑名单,适用于所有攻击者

安全功能:
- API速率限制:每分钟100次请求
- 认证速率限制:每分钟5次请求
- 自动检测可疑请求模式
- 输入清理和验证
- 详细的安全日志记录
2025-12-28 22:45:13 +08:00

59 lines
1.4 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* IP黑名单管理
* 用于阻止已知的攻击者IP
*/
// 已知的攻击者IP列表
const BLOCKED_IPS = [
"193.142.147.209", // 恶意命令执行的攻击者IP
"94.154.35.154", // 恶意脚本服务器IP
"45.172.152.74", // SSH暴力破解IP
"181.46.131.55", // SSH暴力破解IP
"220.80.223.144", // SSH暴力破解IP
"181.104.58.194", // SSH暴力破解IP
"185.141.132.26", // SSH暴力破解IP
"80.253.31.232", // SSH暴力破解IP
"167.99.49.89", // SSH暴力破解IP
"128.199.168.119", // SSH暴力破解IP
"83.142.209.191", // SSH暴力破解IP
"171.244.141.86", // SSH暴力破解IP
];
/**
* 检查IP是否在黑名单中
*/
export function isBlockedIP(ip: string | null): boolean {
if (!ip) return false;
// 检查精确匹配
if (BLOCKED_IPS.includes(ip)) {
return true;
}
// 检查IP段(如果需要)
// 例如:192.168.1.0/24
return false;
}
/**
* 获取客户端真实IP
*/
export function getClientIP(request: Request): string | null {
// 从请求头中获取真实IP(考虑代理情况)
const forwarded = request.headers.get("x-forwarded-for");
if (forwarded) {
// x-forwarded-for可能包含多个IP,取第一个
const ips = forwarded.split(",").map(ip => ip.trim());
return ips[0] || null;
}
const realIP = request.headers.get("x-real-ip");
if (realIP) {
return realIP;
}
return null;
}