CC防护(Challenge Collapsar防护)的核心在于识别并拦截高频、低成本的恶意请求,而基于Referer和User-Agent的复合过滤规则是目前最实用、部署成本最低的一套组合策略。简单说,就是把"请求来源页面"和"客户端身份标识"这两个字段交叉比对,设置多层条件,把不符合正常访问特征的流量直接挡在外面。这套规则不需要复杂的机器学习模型,也不依赖昂贵的硬件设备,一台普通的Web服务器或者WAF就能跑起来,效果却相当扎实。

在实际操作中,很多站长和运维人员只做了单一维度的过滤,比如只判断User-Agent是否为空,或者只检查Referer是否合法,结果要么误杀正常用户,要么被攻击者轻松绕过。真正有效的做法是把这两个字段当作一个"组合锁"来用——单独看每个字段都可能有例外,但两个字段同时异常的概率极低,这样既保证了拦截精度,又不会误伤真实访客。

一、为什么要用Referer和User-Agent做复合过滤

CC攻击的本质是用大量请求压垮服务器资源。攻击者为了降低成本,通常会使用脚本工具、爬虫框架或者自制的攻击程序。这些程序有几个共同特征:第一,User-Agent要么是空的,要么是常见的攻击工具标识(比如python-requests、curl、Go-http-client等);第二,Referer要么为空,要么是伪造的、与实际访问路径不匹配的值。正常浏览器访问时,这两个字段都是完整且一致的。

单独过滤User-Agent的问题在于,很多合法的API调用、小程序请求、甚至某些浏览器的隐私模式都可能不携带标准UA,直接拦截会造成业务损失。单独过滤Referer也有类似问题,比如从收藏夹直接打开页面、从即时通讯软件内嵌浏览器跳转,Referer都可能为空。把两者结合起来,就能大幅降低误判率。

二、Referer字段的过滤规则详解

Referer是HTTP请求头中记录"上一个页面地址"的字段。正常用户从你网站的某个页面点击链接跳转到另一个页面时,Referer会携带来源页面的URL。如果是直接在地址栏输入网址、从书签打开、或者从外部搜索引擎跳转过来,Referer的表现各有不同,但都有规律可循。

具体的过滤规则可以分三层来设置。第一层是"白名单机制":把你自己域名下的所有页面路径加入白名单,凡是Referer以你的域名开头的,一律放行。第二层是"已知来源白名单":如果你有合作站点、CDN回源地址、或者固定的流量入口,把这些域名也加进去。第三层是"异常拦截":Referer为空且请求的不是首页、Referer指向明显不相关的域名、或者Referer中包含明显的攻击特征字符串(比如大量随机字符、已知恶意域名),直接拒绝。

需要特别注意的是,Referer是可以被客户端任意修改的,所以它不能作为唯一的判断依据。但在复合规则中,它的价值在于提供"上下文一致性"——一个正常用户的Referer和User-Agent应该是匹配的,比如用Chrome浏览器从你的首页点击进入,Referer应该是你的首页地址,UA应该是Chrome的标识。如果UA是curl但Referer却是你的内页,这种矛盾本身就是一个强烈的异常信号。

三、User-Agent字段的过滤规则详解

User-Agent告诉服务器"我是什么客户端"。正常的浏览器UA有固定的格式和已知的特征词,比如Chrome包含"Chrome/"、Firefox包含"Firefox/"、Safari包含"Safari/"。而攻击工具的UA通常有几种模式:完全为空、使用通用库标识(如"python-requests/2.28.0")、使用已知攻击框架标识(如"sqlmap/1.7")、或者故意伪装成浏览器但格式不对。

过滤规则同样分三层。第一层是"合法UA白名单":维护一份主流浏览器和已知合法客户端的UA前缀列表,匹配到的直接放行。第二层是"攻击工具黑名单":把常见的爬虫、扫描器、攻击框架的UA特征字符串列出来,匹配到的直接拦截。第三层是"格式异常检测":UA长度异常短(比如少于10个字符)、不包含任何已知浏览器关键词、或者包含明显的乱码和特殊字符,判定为可疑。

这里有个实操技巧:不要试图维护一份"完整的合法UA列表",因为浏览器版本更新太快,列表永远跟不上。更好的做法是维护一份"攻击工具黑名单",这个列表相对稳定,而且覆盖面广。同时配合格式检测,把那些既不在黑名单也不在白名单的"灰色地带"UA用其他规则(比如频率限制、行为分析)来补充判断。

四、复合过滤规则的具体实现逻辑

复合过滤的核心逻辑是"与"和"或"的组合。最常见的策略是:当Referer异常 AND User-Agent异常时,直接拦截;当Referer正常 OR User-Agent正常时,放行;当两者都正常时,当然放行。还有一种更精细的策略是给每个字段打分,比如Referer异常扣30分,UA异常扣40分,总分超过阈值就拦截。

下面给出一个Nginx环境下的具体配置示例,展示如何把Referer和User-Agent复合规则落地:

# Nginx配置示例:CC防护复合过滤规则

# 定义攻击UA黑名单
map $http_user_agent $bad_ua {
    default 0;
    "~*python-requests" 1;
    "~*curl" 1;
    "~*wget" 1;
    "~*sqlmap" 1;
    "~*nikto" 1;
    "~*scanner" 1;
    "~*Go-http-client" 1;
    "~*Java/" 1;
    "~*^$" 1;  # 空UA
}

# 定义合法Referer白名单(自己的域名)
map $http_referer $bad_referer {
    default 0;
    "~*^https?://(www\.)?yourdomain\.com" 0;
    "~*^https?://cdn\.yourdomain\.com" 0;
    "~*^$" 1;  # 空Referer,标记为可疑但不直接拦截
    "~*malicious-domain" 1;
}

# 复合判断逻辑
map "$bad_ua:$bad_referer" $cc_block {
    default 0;
    "1:1" 1;  # UA和Referer都异常,直接拦截
    "1:0" 1;  # UA异常,Referer正常但可能是伪造,拦截
    "0:1" 0;  # Referer异常但UA正常,可能是隐私浏览,放行但记录
}

# 在server块中应用
server {
    if ($cc_block = 1) {
        return 403;
    }
    
    # 频率限制作为补充
    limit_req_zone $binary_remote_addr zone=cc_limit:10m rate=10r/s;
    limit_req zone=cc_limit burst=20 nodelay;
}

这段配置的逻辑是:先通过map指令分别判断UA和Referer是否异常,然后用组合判断决定是否拦截。注意"0:1"的情况没有直接拦截,而是放行但可以配合日志记录做后续分析,这样避免了误杀从隐私模式或者某些特殊入口进来的正常用户。

五、进阶策略:频率与行为的补充

光靠Referer和User-Agent的静态规则,面对高级攻击者是不够的。他们可以轻松伪造这两个字段。所以复合过滤必须配合动态策略。最有效的补充手段是请求频率限制:同一个IP在短时间内发出超过阈值的请求,不管UA和Referer看起来多正常,都要触发挑战或者临时封禁。

行为分析是另一个重要维度。正常用户的访问有明显的"浏览路径"——先访问首页,再点进内页,再可能提交表单。而CC攻击通常是直接对某个高消耗接口(比如搜索、登录、API)发起海量请求,没有合理的页面跳转序列。把访问路径的连贯性纳入判断,可以进一步提升防护精度。

还有一个容易被忽略的点是"慢速CC"。这种攻击不追求高频率,而是用很低的速率持续发送请求,目的是占用连接数而不是带宽。对这种攻击,Referer和User-Agent的过滤几乎无效,必须依靠连接数监控、请求间隔分析、以及会话行为检测来应对。

六、常见误区和避坑指南

第一个误区是"规则越严越好"。很多人一上来就把所有非浏览器UA全部拦截,结果把自己的API接口、合作方的回调请求、甚至搜索引擎的爬虫都挡在外面了。正确的做法是先宽松后收紧,通过日志分析不断调整白名单和黑名单。

第二个误区是"只看单一请求"。CC攻击的特征往往需要从多个请求的聚合数据中才能看出来。单个请求的UA和Referer可能都很正常,但同一个IP在5分钟内发了500次请求,这才是真正的问题。所以一定要把单次判断和统计判断结合起来。

第三个误区是"忽略了合法的空值情况"。很多正常场景下Referer确实为空,比如HTTPS页面跳转到HTTP页面时浏览器会剥离Referer,用户从桌面快捷方式打开浏览器、从邮件客户端点击链接等。对这些情况要有专门的豁免逻辑,而不是一刀切地拦截。

七、规则维护和持续优化

任何过滤规则都不是一劳永逸的。攻击者会不断更新工具、更换UA伪装、寻找新的绕过方式。建议建立一套定期审查机制:每周分析一次拦截日志,看看有没有误杀案例;每月更新一次黑名单,把新出现的攻击工具标识加进去;每季度做一次规则效果评估,统计拦截率、误杀率、漏放率这三个核心指标。

同时要善用日志。把所有被拦截的请求的完整信息(IP、UA、Referer、请求路径、时间戳)记录下来,定期做聚类分析。你会发现攻击者的行为模式是有规律的,比如某些IP段集中攻击、某些时间段流量异常、某些特定接口被反复针对。这些信息反过来可以指导你优化规则,形成一个正向循环。

总的来说,基于Referer和User-Agent的复合过滤规则是CC防护体系中最基础也最不可或缺的一环。它不需要你有多高深的技术背景,不需要采购昂贵的设备,但需要你对业务流量有深入的了解,对攻击手法有清醒的认识。把这套规则做扎实了,配合频率限制和行为分析,就能挡住绝大多数的CC攻击,让你的服务器在面对恶意流量时有足够的喘息空间。