不能只靠 user-agent 判断爬虫,因其可随意伪造:正常用户可能篡改ua被误拦,高级爬虫能模拟合法ua但行为异常,搜索引擎和app等合法客户端ua又易漏判或误封。

Fiber 框架本身没有内置“爬虫 UA 拦截中间件”,得自己写;但直接匹配 User-Agent 字符串非常容易误杀、绕过,不推荐作为唯一防护手段。
为什么不能只靠 User-Agent 判断爬虫
真实环境中,User-Agent 是客户端可随意伪造的 HTTP 头字段,连浏览器插件都能一键切换。常见问题包括:
- 正常用户用 Edge 浏览器但 UA 被脚本改成
curl/7.68.0,被误拦 - 高级爬虫(如 Puppeteer + stealth 插件)会主动模拟 Chrome 完整 UA + fingerprint,UA 合法但行为异常
- 部分搜索引擎(如 Bingbot)UA 合法且公开,你真要拦?
- 移动端 App、小程序、内嵌 WebView 的 UA 往往不含 “Mobile” 或 “Android”,容易漏判
在 Fiber 中编写基础 UA 拦截中间件
如果你仍需快速加一层轻量过滤(比如屏蔽明显恶意 UA),可用 fiber.Next() 控制流程,注意别用正则过度匹配:
Agent Security DLP - 企业级数据防泄漏系统 功能: 入口防护、记忆保护、工具管控、出口过滤、审计日志 规则: 170条,覆盖金融、医疗、汽车、销售、人力资源、物流等25+行业 触发: check-output(对话出口) / check-input(对话入口) / check-tool(工具执...
func BlockBotMiddleware() fiber.Handler {
return func(c *fiber.Ctx) error {
ua := c.Get("User-Agent")
// 只匹配明确的、无歧义的爬虫标识
if strings.Contains(ua, "Go-http-client") ||
strings.Contains(ua, "python-requests") ||
strings.Contains(ua, "Scrapy") ||
strings.Contains(ua, "HeadlessChrome") {
return c.Status(fiber.StatusForbidden).SendString("Forbidden")
}
return c.Next()
}
}
注册方式(在 app.Use(...) 中):
- 放在路由前:全局生效
app.Use(BlockBotMiddleware()) - 放在具体路由组:仅对 API 生效
api := app.Group("/api"); api.Use(BlockBotMiddleware())
更靠谱的替代方案:结合行为特征
单靠 User-Agent 不足以判断是否为爬虫,建议叠加以下低成本信号:
- 检查
Accept头:真实浏览器通常含text/html,application/xhtml+xml,纯爬虫常只发application/json或留空 - 检查
Sec-Fetch-*系列头(如Sec-Fetch-Mode: navigate),现代浏览器自带,爬虫极少设置 - 记录同一 IP 短时间高频请求(如 10 秒内 >5 次 GET /),用
fiber/storage或 Redis 做简单计数 - 对敏感接口(如登录、搜索)要求带
X-Requested-With: XMLHttpRequest或校验 Referer
真正需要防爬的场景,User-Agent 只能当第一道筛子——它拦不住有心人,但能过滤掉最懒的扫描器。别把它当防火墙,也别在中间件里写超长 UA 黑名单,维护成本高、效果差。










