研究基于Referer与UA特征的异常访问过滤算法及白名单策略
摘要:# 网站被“爬”到快死机?这套小众防护组合拳,能帮你省下不少钱 前两天跟一个做电商的朋友吃饭,他愁眉苦脸地跟我吐槽:“网站后台总被一些莫名其妙的请求搞到CPU报警,流量看着也不大,但就是卡得不行。上了高防,好像也没啥用,钱倒是花了不少。” 我让他把日志…
网站被“爬”到快死机?这套小众防护组合拳,能帮你省下不少钱
前两天跟一个做电商的朋友吃饭,他愁眉苦脸地跟我吐槽:“网站后台总被一些莫名其妙的请求搞到CPU报警,流量看着也不大,但就是卡得不行。上了高防,好像也没啥用,钱倒是花了不少。”
我让他把日志发我瞄一眼。好家伙,满屏都是带着各种奇怪Referer(来源页)和User-Agent(用户代理)的请求,有些甚至伪装成百度、谷歌爬虫,但访问频率和路径一看就不对劲。说白了,这根本不是那种需要“硬扛”的DDoS,而是典型的恶意爬虫和CC攻击在搞鬼,你用抗大流量攻击的高防IP,纯属高射炮打蚊子——不对路,还死贵。
很多中小站长的痛点就在这儿:攻击没到能触发高防清洗的阈值,但源站已经被这些“慢性毒药”式的异常访问拖垮了。 今天,我就想抛开那些大而全的“黑话”方案,跟你聊聊一个非常具体、且常常被忽略的防护思路:基于Referer和UA特征的异常访问过滤与白名单策略。这东西,配置好了,往往比盲目堆硬件更管用。
一、为什么盯着Referer和UA?因为“坏人”也爱偷懒
先别被“算法”、“策略”这些词吓到。咱们用大白话拆开看:
- Referer(来源页):简单说,就是浏览器告诉服务器“我是从哪个页面点过来的”。正常用户,要么是从搜索引擎结果点进来,要么是从你站内其他页面跳转,或者是从你投放的广告链接来。这个字段,按理说是有迹可循的。
- User-Agent(用户代理):就是浏览器(或爬虫程序)的“身份证”,里面包含了浏览器类型、版本、操作系统等信息。正常的Chrome、Firefox、手机浏览器,UA都有固定的格式。
那攻击者怎么利用这些呢?
他们写自动化脚本(爬虫或攻击工具)来扫你网站,为了省事和伪装,往往会做两件事:
- 批量伪造或留空Referer:成千上万的请求,要么不带Referer(直接访问),要么Referer填一个跟你网站八竿子打不着的垃圾站地址。这种“无源之水”或者“脏水”,在日志里非常扎眼。
- 使用特征明显的UA:很多攻击脚本用的底层请求库(比如Python的requests,或一些老旧爬虫框架),其UA字符串有固定的特征。甚至有些干脆不设UA,或者UA里包含“bot”、“spider”、“scan”这类明显的关键词(当然,高级的会伪装成浏览器,但仍有破绽)。
所以,我们的核心思路就来了:与其在浩瀚的流量海洋里盲目拦截,不如先给“好人”发个通行证,把那些行为特征明显异常的“可疑分子”提前筛出去。 这就是“白名单策略”的精髓——先定义什么是绝对正常的,其他的再细细审查。
二、白名单策略:给你的“常客”开个VIP通道
白名单不是让你把全世界的IP都列进去,那不可能。我们说的是 “特征白名单” 。
1. Referer白名单(最常用,也最有效) 想想你的网站,正常流量应该从哪里来?
- 你的主域名本身(比如
https://www.yoursite.com),用于站内跳转。 - 你信赖的合作伙伴、广告投放平台的域名。
- 各大主流搜索引擎的域名(如
google.com,bing.com,baidu.com)。 - 社交媒体引流(如
twitter.com,facebook.com,如果你的业务涉及)。
具体操作(以Nginx配置为例,道理相通):
# 定义合法的Referer来源
valid_referers none blocked server_names
*.yoursite.com
*.trusted-partner.com
google.com baidu.com bing.com;
# 对特定位置(比如后台登录页、API接口、商品详情页)应用规则
location /admin/ {
# 如果Referer不在白名单中,且不为空(直接访问),则返回403或重定向
if ($invalid_referer) {
return 403; # 或者 return 444; (Nginx静默关闭连接)
}
# 其他正常处理逻辑...
}
注意: 对首页、公开文章页这类页面要谨慎,因为用户可能直接收藏或输入网址访问(Referer为空),这类情况应该放行。所以白名单策略一定要有针对性,主要用在后台、登录口、核心API、高频查询页面等敏感位置。
2. UA白名单(辅助手段,需谨慎) 这个更精细,也更容易误伤。我一般只用来做两件事:
- 放行已知的、友善的爬虫:比如各大搜索引擎官方的爬虫UA(百度蜘蛛、Googlebot等),确保你的SEO不受影响。这些UA列表是公开的。
- 在特定极端场景下拦截“已知恶意”的UA特征:比如,日志里突然大量出现某个特定版本的、非主流浏览器的UA在疯狂请求某个接口,经过分析确认是攻击工具,可以临时封禁该特征。
坦白说,UA过滤我用的不多。 因为现在伪装UA太容易了,靠这个做主要防御不靠谱。它更像是一个“事后补救”或者“精准打击”的补充工具。
三、异常访问过滤算法:识别那些“装成好人的坏蛋”
好了,现在VIP通道(白名单)开了。但坏人也不傻,他们会伪造白名单里的Referer来绕过检查。这时候,就需要“算法”登场了——其实没那么玄乎,就是一些基于频率和行为的规则判断。
1. 同一Referer(尤其是伪造的)的请求频率异常
假设你的白名单里允许 baidu.com。一个正常的百度搜索用户点击进来,访问几个页面就会离开。但如果一秒内,有上百个请求都带着 https://www.baidu.com 这个Referer,疯狂刷你的某个API,这正常吗?绝对不正常。 这很可能是一个攻击脚本在批量伪造百度Referer。
怎么抓?
- 计数与时间窗口: 在防火墙或应用层(比如用Nginx的
limit_req模块,或者写一段简单的Lua脚本)设置规则:“对于来自同一Referer(或同一IP+同一Referer组合)的请求,在10秒内超过50次,就进行挑战或临时封禁。” - 关注非常规路径: 如果带着搜索引擎Referer的请求,不去看文章页,而是直奔你的后台登录口
/admin/login或密码重置页面,这绝对是恶意行为。
2. “空Referer”或“垃圾站Referer”的聚集访问 前面说了,直接访问(空Referer)在某些页面是正常的。但如果:
- 在短时间内,大量不同的IP都带着“空Referer”来攻击你的登录接口。
- 或者,突然出现大量Referer指向某个同一色情、博彩类垃圾域名的请求。
这本身就是强烈的攻击信号。对于这类情况,我通常会直接设置一个阈值,超过就触发严格封禁,连验证码都省了。
3. UA与Referer的“不合理组合” 这是一个稍微高级点的技巧。比如:
- UA是手机浏览器,但Referer却是一个PC端专业工具网站,这种组合概率很低。
- UA声称是“Chrome 120”,但请求头里却缺少现代Chrome浏览器该有的其他特征字段(如
Sec-CH-UA等),这很可能是伪造的。
检测这种不匹配,需要更细致的规则引擎(比如开源的ModSecurity,或者云WAF的定制规则),但一旦配置好,抓“李鬼”一抓一个准。
四、实战心得:别追求完美,抓住主要矛盾
搞了这么多年防护,我最大的体会就是:没有一劳永逸的银弹,所有策略都是平衡的艺术。
- 从日志分析开始,别拍脑袋: 在上任何规则之前,先用工具(如GoAccess、ELK Stack)分析你最近一周的访问日志。看看真实用户的Referer和UA是什么样的,攻击尝试又长什么样。你的策略必须基于你自己的业务数据,而不是抄我的模板。
- 灰度上线,观察误伤: 任何一条新规则,先放在“仅记录日志”不拦截的模式下跑一天。看看它会命中多少请求,其中有多少是误伤的正常用户。调整阈值后,再开启拦截。
- 白名单为主,黑名单为辅: 优先把确凿无疑的好人放进来,减少误判。对于可疑的,先用验证码(如hCaptcha)挑战,而不是直接封IP。直接封IP容易误伤共用出口IP的普通用户(比如公司、学校网络)。
- 组合使用,效果更佳: Referer/UA过滤 + 频率限制 + IP信誉库 + 验证码,这套组合拳下来,能过滤掉90%以上的低阶爬虫和CC攻击,让你的服务器资源真正服务于业务。
说到底,防护的本质是增加攻击者的成本和不确定性。当你的站需要他们花费大量精力去伪造更逼真的Referer链、模拟更复杂的浏览器指纹时,很多脚本小子就会知难而退,转而去找那些还“裸奔”的站点了。
你的源站,真的没必要对所有流量“敞开心扉”。给它设个门槛,把那些鬼鬼祟祟的家伙挡在门外,你会发现,世界清静了,服务器也凉快多了。好了,今天就聊到这儿,赶紧去看看你的服务器日志吧,说不定惊喜(吓)正在等着你。

