在 Web 安全与资源管控体系中,Referer 校验是一种成本极低、落地简单的来源身份校验机制,广泛应用于静态资源防盗链、接口访问管控、CSRF 辅助防护等场景。它依托 HTTP 协议原生的请求头字段实现,无需额外开发复杂的认证体系,就能完成基础的请求来源合法性校验。
一、Referer 是什么
Referer 是 HTTP 请求头中的标准字段,由浏览器(或 HTTP 客户端)在发起请求时自动填充,用于标识当前请求的来源页面 URL。
例如:用户在https://www.example.com/blog页面点击链接,跳转到https://www.example.com/article/1,此时浏览器向 article 接口发起的请求中,会自动携带如下请求头:
Referer: https://www.example.com/blogReferer 字段的原生设计初衷是统计网站访问来源、分析用户行为,后来逐步被用于安全校验场景。需要注意的是,Referer 属于客户端可控字段,并非服务端强制生成,这决定了它的安全边界存在天然局限。
二、Referer 校验的核心原理
Referer 校验的本质是服务端对请求来源的白名单匹配校验,核心逻辑可以概括为三步:
- 提取字段:服务端通过拦截器、中间件或 Web 服务器配置,读取 HTTP 请求头中的 Referer 值;
- 规则匹配:将提取到的 Referer 解析出协议、域名、端口等核心信息,与服务端预设的合法来源白名单进行匹配;
- 决策放行:匹配成功则判定为合法来源,正常处理请求;匹配失败则判定为非法来源,直接返回 403 拒绝访问、重定向到错误页或返回占位资源。
整个校验过程发生在服务端请求处理的前置环节,属于网关层或应用层的轻量过滤逻辑。
三、完整的校验执行流程
一次标准的 Referer 校验会经历完整的链路流转:
- 客户端发起请求:用户通过浏览器访问资源,浏览器根据同源策略和 Referrer 策略,自动在请求头中添加 Referer 字段;
- 请求到达服务端:请求先经过 Web 服务器(Nginx/Apache)或应用网关,触发 Referer 校验逻辑;
- 解析 Referer 结构:校验组件对 Referer URL 进行结构化解析,提取 scheme(http/https)、host(域名)、port(端口);
- 白名单规则匹配:按照预设的匹配规则(精确匹配、后缀匹配、正则匹配)对比解析结果;
- 执行校验结果:合法请求放行进入业务逻辑,非法请求直接拦截并返回响应。
四、常见的校验规则与实现方式
Referer 校验的规则灵活度很高,不同场景会使用不同强度的匹配策略,常见的有四类:
1. 精确域名匹配
只允许指定的完整域名访问,是最严格的匹配方式。 例如白名单配置为https://www.example.com,只有 Referer 完全等于该值时才放行。
2. 域名后缀匹配
允许主域名下的所有子域名访问,适合多子域名的业务场景。 例如白名单配置为.example.com,则a.example.com、b.example.com均可通过校验。
3. 协议 + 域名 + 端口完整匹配
对端口有严格要求的内部系统,会校验协议、域名、端口三者完全一致。 例如https://api.example.com:8443,端口不匹配则拦截。
4. 正则表达式匹配
针对复杂的来源规则,使用正则表达式做灵活匹配。 例如匹配所有 example 系域名的正则:
^https?://([a-zA-Z0-9-]+\.)*example\.com(/.*)?$典型实现示例
以 Nginx 静态资源防盗链配置为例,是最常见的 Referer 校验落地方式:
location ~* \.(jpg|jpeg|png|gif|mp4)$ { valid_referers none blocked server_names *.example.com example.com; if ($invalid_referer) { return 403; } }其中none表示允许空 Referer,blocked表示允许经过代理 / 防火墙隐藏 Referer 的请求,server_names表示允许当前服务器配置的所有域名。
五、典型应用场景
1. 静态资源防盗链
这是 Referer 校验最广泛的应用,图片、视频、文件下载等静态资源通过校验 Referer,防止其他网站直接引用自身资源,消耗服务器带宽。
2. CSRF 攻击辅助防护
在早期 Web 安全方案中,Referer 校验常被用于防范 CSRF 攻击:校验请求是否来自本站域名,阻止第三方站点构造的恶意请求。但由于 Referer 可被篡改,它只能作为辅助手段,不能作为主力防护。
3. 接口来源管控
部分内部接口或开放接口,通过 Referer 校验限制调用来源,只允许授权的前端域名调用,降低接口被滥用的风险。
4. 访问来源统计
通过分析 Referer 字段,统计用户从哪些渠道、哪些页面进入目标页面,用于运营分析和流量归因。
六、安全局限与常见绕过方式
Referer 校验属于弱安全校验,存在诸多天然局限,在严格的安全场景中不能单独依赖。
1. 客户端可主动禁用 / 隐藏 Referer
- 浏览器隐私模式、插件可配置不发送 Referer;
- 前端页面通过
<a rel="noreferrer">、Referrer-Policy: no-referrer等方式,控制跳转时不携带 Referer; - HTTPS 页面跳转到 HTTP 页面时,浏览器默认不携带 Referer。
2. 可通过工具任意篡改
抓包工具(Charles、Fiddler、Burp Suite)、浏览器控制台、自定义 HTTP 客户端都可以随意修改或伪造 Referer 头,服务端无法识别伪造的 Referer。
3. 校验规则不严导致的绕过
- 后缀匹配漏洞:白名单允许
example.com,攻击者构造example.com.attacker.com,部分校验逻辑会错误匹配后缀; - 包含匹配漏洞:仅判断 Referer 中是否包含白名单字符串,攻击者构造
https://attacker.com/?url=example.com即可绕过; - 空 Referer 放行漏洞:很多站点配置允许空 Referer,攻击者直接构造不带 Referer 的请求即可绕过校验。
4. 跨协议场景失效
HTTPS 到 HTTP 的跳转默认丢失 Referer,导致合法请求被误拦截,很多站点因此放宽校验规则,进一步降低安全性。
七、生产环境最佳实践
为了在可用性和安全性之间取得平衡,生产环境使用 Referer 校验建议遵循以下原则:
- 不单独作为安全防护手段:敏感接口、核心操作必须使用 CSRF Token、接口签名、身份认证等强校验方式,Referer 仅作为辅助过滤层。
- 严谨配置匹配规则:优先使用精确域名匹配,慎用后缀匹配和包含匹配;使用正则时必须锚定开头和结尾,避免被拼接绕过。
- 合理处理空 Referer:公开静态资源可允许空 Referer 保障兼容性,敏感接口必须禁止空 Referer。
- 配合 Referrer-Policy 响应头:通过
Referrer-Policy: same-origin等配置,控制本站页面只在同源请求下携带完整 Referer,减少信息泄露。 - 异常情况降级处理:对误拦截的合法请求,提供兜底跳转或占位提示,避免影响正常用户体验。
总结
Referer 校验是 Web 开发中非常经典的轻量来源校验方案,它实现简单、接入成本低,在防盗链、流量管控等场景下具备很高的性价比。但受限于 HTTP 协议的设计,Referer 本质上是客户端可控字段,安全强度有限,绝不能将其作为唯一的安全防线。在实际项目中,应当将它作为多层防护体系中的一环,配合其他强认证机制,共同保障 Web 应用安全。