Iris无内置爬虫拦截能力,须自定义中间件实现:需解析X-Forwarded-For获取真实IP并排除私有网段,对User-Agent和Referer执行白名单、黑名单、正则三重校验,Referer须非空且域名合法,IP黑名单应存Redis并设TTL,命中即403+StopExecution。

直接结论:Iris 没有开箱即用的爬虫拦截能力,必须靠自定义中间件 + 多层规则组合实现,且关键点不在“拦什么”,而在“怎么取到真实客户端信息”和“避免误杀”。
为什么 ctx.RemoteAddr() 拦不住真实爬虫
因为绝大多数生产环境都跑在 Nginx 或 Cloudflare 后面,ctx.RemoteAddr() 返回的是反向代理的 IP(比如 127.0.0.1 或 10.10.10.10),不是用户真实出口 IP。你封的其实是自己的网关。
必须手动解析转发链:
- 优先读
ctx.GetHeader("X-Forwarded-For"),按逗号分割后取第一个非私有 IP - 用
net.ParseIP()+net.IPNet.Contains()判断是否属于10.0.0.0/8、172.16.0.0/12、192.168.0.0/16、127.0.0.0/8等私有网段 - 若为空或全是私有地址,再 fallback 到
ctx.RemoteAddr()(仅限直连调试场景)
怎么安全校验 User-Agent 和 Referer
字符串包含匹配(strings.Contains(ua, "sqlmap"))极易误杀——比如正常 UA 里带 map 就被干掉。要分三步走:
- 先查白名单:
"Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"这类应直接放行 - 再查黑名单:
"sqlmap"、"gobuster"、"dirb"、"masscan"等已知工具特征(注意大小写不敏感) - Referer 必须非空,且域名需匹配预期前缀(如只允许
https://app.example.com或https://admin.example.com),不能是任意第三方域名
ctx.GetHeader("Referer") 返回空字符串 ≠ header 不存在,可能是客户端根本没发,别 panic,走默认拒绝逻辑。
IP 黑名单该存在哪、怎么查才不拖慢请求
每次请求都去读文件或查数据库?那性能直接崩。正确做法:
- 内存 map 仅用于开发或极低频更新场景,上线必须用 Redis;建议用
HSET存 IP → 封禁原因,EXPIRE设自动过期时间 - 命中黑名单后,立刻执行
ctx.StatusCode(403)+ctx.StopExecution(),绝不能调ctx.Next() - 不要用
strings.Contains(ip, "192.168.")做 CIDR 匹配——它会把192.168.100.1和192.1680.1.1都错判,必须用net.IPNet.Contains()
容易被忽略的致命细节
很多团队写了中间件但效果差,问题往往出在边界处理上:
- 没区分
GET /api/data和POST /api/login的防护强度——登录接口该加人机验证,数据接口该强限流,混用规则等于裸奔 - 日志里只记了 IP,没记完整
User-Agent和Referer,导致攻击复盘时无法确认是工具还是人工 - 黑名单 IP 写进 Redis 却没设 TTL,某次误封后永远解不开,运维半夜被叫醒
真实攻击流量不会等你补完所有 case 才来,先保核心接口可用,再逐步收紧规则。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











