边缘节点基于请求头校验的防盗链方案,核心逻辑是客户端在请求中携带动态Token,由CDN边缘解析并验证,合法请求放行回源,非法请求直接拦截,将防篡改和时效控制前置到最接近用户的一层。
请求头校验防盗链方案和常见Referer校验有什么本质区别
传统Referer校验之所以被逐渐淘汰,是因为它太容易被伪造了,任何能修改请求的工具,甚至浏览器插件,都能轻易伪造来源域名,让服务器误以为是自家网站页面发起的合法请求,更重要的是,很多隐私保护浏览器和公司内网策略会主动清除Referer,导致合法用户被误杀。
请求头校验方案完全不同,它不关心来源域名,而是验证请求头中携带的签名信息,这个签名通常由密钥、URI路径、过期时间戳三者经过算法生成,边缘节点拿到请求后,用同样的密钥和算法重新计算一遍,比对是否一致,同时检查时间戳是否在有效期内,只要密钥不泄露,攻击者就无法伪造出合法签名。
这是两大方案的直接对比:
| 维度 | Referer校验 | 请求头Token校验 |
|---|---|---|
| 防伪造能力 | 极弱,容易模拟 | 较强,依赖密钥保密 |
| 误伤率 | 较高,隐私模式误杀 | 较低,只要实现正确 |
| 配置复杂度 | 简单,一条规则 | 中等,需配合回源逻辑 |
| 缓存命中率 | 不受影响 | 影响较大,需额外方案 |
| 热点文件防护 | 无法防护 | 可配合时间戳防盗链 |
很多站长问百度知道上提到的“防盗链设置后图片打不开”,多数情况就是Referer校验把自家页面也拦截了,或者移动端APP发起的请求根本不带Referer,换到请求头校验后,这类问题基本能根除。
边缘节点如何具体实现请求头校验
边缘节点执行请求头校验,并不是简单对比一个字段是否相等,而是一套完整的验证链路。
校验流程的五个核心动作
- 读取请求头字段,通常约定为自定义头部,比如
X-Media-Token或者X-Signature,如果请求头中不存在该字段,直接返回403状态码,不再继续后续流程。 - 拆解Token内容,从Token字符串中提取过期时间戳和签名串,常见格式是
的结构,边缘节点先解码时间戳部分。base64(时间戳).md5(密钥+URI+时间戳)
- 执行时间有效性判断,拿当前时间戳和Token中的过期时间对比,如果当前时间已经超过过期时间,即使签名正确也返回403,这是时间戳防盗链的核心逻辑。
- 重算签名,边缘节点使用配置的共享密钥,按照约定算法重新计算签名,与请求中的签名串做对比,一致则通过,不一致则拦截。
- 通过后回源或命中缓存,校验通过后的请求,边缘节点将其视为合法请求,继续执行缓存查找或回源拉取。
边缘节点视角下的密钥配置
边缘节点需要配置密钥的地方有两处,一处是在边缘节点控制台的鉴权配置模块,填入共享密钥,这一步是让边缘节点知道用什么密钥来验签,另一处是源站服务器,源站返回内容时如果需要生成带签名Token的URL,也必须用同一个密钥,两处配置一旦不一致,边缘节点验签必然失败。
行业里也有更稳妥的做法:不用明文密钥写在URL里,而是把签名后的凭证放在Cookie里,边缘节点启动一个专用校验模块来读取Cookie中的凭证,这种方式尤其适合需要支持HTTP2和长连接的服务,因为请求头字段在HTTP2多路复用下可能有兼容性开销。
配置边缘节点验证规则时最容易被忽略的缓存问题
这是请求头校验方案落地时最大的坑,也是很多技术论坛里讨论最热烈的部分。
边缘节点的缓存逻辑默认只关注URI,不关注请求头,也就是说,如果一个带合法Token的请求回源拉取了图片并缓存到边缘节点,下一个请求即使Token校验失败,边缘节点也可能直接命中缓存返回内容,校验机制形同虚设。
破解办法是让缓存键和Token建立关联,但这又带来缓存碎片化的问题,每个Token不同,缓存命中率急剧下降,一个折中且被大量CDN服务商采纳的方案是:
- 只对动态资源和未缓存资源执行请求头校验
- 对于已经缓存的热点文件,以较短的时间窗口(比如300秒)做校验缓存,窗口期内放行,窗口期后重新校验
- 源站返回时增加
Cache-Control: private头,强制规定这类响应不进入边缘共享缓存
实际配置路径通常是这样的:登录CDN控制台,进入域名管理,找到访问控制或鉴权配置模块,选择
请求头校验模式,这里会要求填两个参数:一个是指定请求头名称,比如X-Sign;另一个是校验模式,通常有全程校验和仅回源校验两种可选。只要选择“仅回源校验”就能避开缓存问题,代价是每次请求都回源,源站压力增大,对于图片类小文件,这种代价可以接受;对于视频大文件,回源成本则相当可观。
边缘节点返回错误码时的细节处理
当校验失败时,边缘节点不能一概而论地返回403,为了兼容真实用户场景,需要区分两类失败:
- Token过期,返回403,或者更友好的做法是返回302重定向,把用户导向一个重新生成Token的接口,这种场景常见于用户长时间停留在页面后,嵌入资源的URL过期。
- 签名不合法,说明请求可能来自爬虫或盗链者,直接返回403,并在响应头中添加
X-Reject-Reason: invalid-signature字段,方便源站日志排查。
更成熟的做法是,边缘节点在返回403的同时,输出一段极简的HTML响应体,内容只有一行提示文字,不带任何图片或脚本,避免被利用做内容注入,这段响应体的内容可以在控制台自定义。
什么是回源鉴权以及它和边缘校验的关系
边缘节点校验通过后,是否需要把Token透传给源站再验一次,是很多团队纠结的地方。
行业共识是边缘校验通过后,源站不需要重复校验,理由很明确:边缘节点和源站之间通常是内网通道,不是公网暴露的,攻击者无法直接绕过边缘节点访问源站,前提是源站做了严格的访问控制,只允许边缘节点的回源IP访问。
但如果源站直接暴露在公网,或者源站同时服务多个系统和多个CDN厂商,那么就必须增加回源鉴权,做法是边缘节点将原始请求头转发回源,源站在接收之前再执行一次相同的验签逻辑,这种情况下,边缘节点承担的是第一层拦截,源站的是第二层兜底。
具体操作中,回源鉴权使用的密钥可以和边缘校验的密钥不同,源站配置的密钥只用于回源链路验证,这样即使某个CDN厂商配置泄露,源站依然有保障。
H2:请求头校验在边缘节点如何与WAF规则联动
边缘节点通常不止具备缓存转发能力,还集成了Web应用防火墙,请求头校验可以和WAF规则配合,形成多层级防御。
一个典型的场景是:边缘节点先执行请求头校验,通过后将请求交给WAF继续做后续检测,逻辑链条是先验身份,再做内容安全检测,如果请求头都没有合法签名,WAF规则都没必要执行,节省计算资源。
配置联动时,边缘节点上需要设置规则优先级,确保鉴权规则优先于WAF其他规则,这个顺序可以在控制台中拖动调整,不少运维人员初始配置时把自己定义的鉴权规则排在了WAF规则后面,导致的结果是边缘节点已经放行了恶意请求,WAF还在费力地扫描攻击载荷,防护效果大打折扣,却不清楚问题出在哪里。
更进阶的用法是把请求头校验结果作为WAF规则的一个条件变量,比如当签名校验失败且UA字段为空时,直接封禁整条IP段3600秒,这种组合规则能有效抑制批量盗链的爬虫程序。
移动端和HTTPS环境下请求头校验的改动要点
移动APP发起的请求和浏览器有较大差异,一些APP的HTTP库不支持自定义请求头,或者开发者不想改动客户端代码,这时可以换成Query参数携带签名的方式,把Token放在URL查询串中,边缘节点校验时读取查询参数即可,逻辑和请求头校验完全一致,只是取值位置不同。
HTTPS环境下请求头是加密传输的,不存在明文泄露问题,反而需要注意边缘节点对外提供的证书必须完整覆盖整个链路,如果源站也做HTTPS证书校验,边缘节点回源时需要配置对应的客户端证书。
边缘节点请求头校验的Q&A
问:请求头校验能彻底防住所有盗链吗?
答:不能,任何防御方案都有破解之道,密钥泄露或合法用户分享链接都会绕过校验,请求头校验的目标是把盗链成本提升到远高于内容本身价值的程度,让绝大多数盗链者放弃,而不是追求绝对防御,业务上应配合频次控制和IP黑名单逐步收紧。
问:配置请求头校验后,边缘节点缓存命中率下降明显,怎么办?
答:将校验策略调整为仅对首次回源请求校验,后续相同URI的请求在校验缓存时间窗口内直接放行,窗口时间不宜过长,300秒是一个平衡点,行业经验数据表明,这一改动能让缓存命中率恢复至接近原有水平,而盗链窗口仅为数分钟,其影响可以忽略。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/646703.html





