账单上的 CDN 流量突然涨了一截,日志里的业务量却没有对应增长,很多团队都遇到过这种情况。多数时候,是别人的网页直接引用了你的图片或视频地址,带宽成本悄悄转到了你的账户上。阿里云防盗链就是为这类问题准备的。配置得当,可以把非法引用挡在外面,正常用户几乎感觉不到。

盗链通常从哪里来
盗链的做法并不复杂。别人的页面里写上你的资源地址,比如图片的 src 或视频的 source 指向你的 CDN 域名或 OSS 地址,用户打开那个页面时,浏览器就直接去你的服务器拉文件。对方不用存储任何内容,流量和费用却都算在你头上。
实际遇到的来源大致有三类。一是采集站和内容聚合站,它们会批量抓取页面里的图片和视频地址。二是论坛、问答社区里的第三方引用,有人复制了一段带地址的代码,却不知道这会产生费用。三是测试环境或旧版本页面,它们还指向线上资源,产生了一些没人需要的访问。第三类最容易被忽略,它没有恶意,只是没人记得清理。
Referer 白名单怎么配
Referer 是 HTTP 请求头里的一个字段,记录了请求是从哪个页面发出的。阿里云 CDN 和 OSS 都支持基于 Referer 的访问控制,思路很直接:只放行来自指定域名的请求,其余请求返回 403,或者返回一张替代图片。
配置时有几个地方需要想清楚:
- 白名单域名:把官网、移动端站点和必要的合作方域名填进去,支持通配符,比如 *.example.com。漏掉一个移动端域名,最先出问题的通常是那里的图片。
- 是否允许空 Referer:直接在地址栏打开、部分浏览器的隐私设置、部分客户端的请求,都可能没有 Referer。允许空 Referer,防护会弱一些;禁止它,又可能误伤正常用户。要不要放行,取决于你的访问路径里有多少这类请求。
- 黑名单模式:如果只有少数几个站点明确有问题,可以直接拉黑,不必开放一整张白名单。这种方式适合内容本身比较公开、不方便限定来源的场景。
- 拦截后的返回:返回 403 最省事,也最省资源。返回一张提示图对品牌展示更友好,但每次拦截都会产生一次图片回源,量大时要算一下。
Referer 能挡住的是大多数不设防的盗链,但挡不住有心伪造请求头的人。所以它更像第一道门,后面还需要其他手段配合。
时间戳鉴权:让链接只在有效期内可用
如果资源是付费课程视频,或者需要限时访问的文件,光靠 Referer 就不够了。时间戳鉴权的做法是给每个资源地址附加一段签名参数,签名里包含过期时间、随机数、用户标识和哈希值。CDN 节点收到请求后,会校验签名是否正确,链接有没有过期。
一个典型的鉴权地址大致是这样的:
https://cdn.example.com/video/lesson01.mp4?auth_key=时间戳-随机数-用户标识-哈希值
哈希值由服务端根据文件路径、时间戳、随机数和密钥计算得出。密钥只存在服务端,前端拿不到,外部用户即使复制了链接,也没办法自己算出新的有效签名。链接过期之后,被转存出去的地址也就失效了。
实际部署时,签名最好由业务服务端在用户登录并通过权限校验之后动态生成,而不是把一个长期有效的地址写死在页面里。有效期设成满足播放需要的最短时长就够了。视频一般设置为几十分钟到几个小时,图片展示的时效可以按页面停留时间来定。
OSS 场景下的签名访问
资源直接放在对象存储 OSS 里时,也可以用签名 URL 达到类似效果。OSS 支持为 Bucket 中的对象生成带过期时间的访问地址,同时还能叠加 Bucket 级别的 Referer 白名单,两层一起用。
这里有两点需要特别留意。第一,如果 Bucket 设置成了公共读,任何人都能直接访问对象,前面的配置都会失效,所以敏感资源应保持私有读。第二,签名用的 AccessKey 要管好。建议使用 RAM 子账号,只授予必要的权限。长期密钥一旦泄露,影响面会比单个链接大得多。
一个假设的落地过程
设想一家在线教育团队,课程视频直接通过 CDN 域名对外播放。某段时间里,流量费用的涨幅明显超过了课程销量的增长。翻访问日志时,他们发现大量请求的 Referer 指向几个第三方学习资料站,这些站点用 iframe 或直接引用的方式播放了他们的视频,既没有付费,也几乎没有带来转化。
这类情况下,比较顺的处理顺序大致是这样:先在 CDN 控制台开启 Referer 白名单,只保留官网、App 内嵌 H5 页面和测试域名,空 Referer 暂时不放行;再让业务后端为视频动态签发时间戳鉴权链接,有效期设为两小时,足够覆盖一次正常观看;最后把原有的静态地址统一替换掉,并在日志里盯着被拦截请求的比例。
这样改之后,异常来源的请求通常会明显减少。但也要预期一个小插曲:部分旧版本 App 可能因为缓存了老地址而加载失败。这时可以给一个过渡期,允许旧版本在一段时间内继续以空 Referer 访问。防盗链策略的上线,要看客户端版本分布,只改服务端配置是不够的。
落地时的几条建议
- 先开启日志和监控,弄清盗链流量主要来自哪里,再决定防护强度。没有数据就直接收紧,很容易误伤正常用户。
- 先在测试域名或访问量低的资源上验证,确认拦截规则和播放流程都正常,再逐步扩大范围。
- 区分公开资源和敏感资源。公开图片用 Referer 策略就够了;付费内容则要叠加时间戳鉴权,并使用私有读。
- 定期清理白名单。合作方下线后,对应域名应及时移除;新渠道接入时,记得补上配置。
- 签名密钥放进密钥管理体系,定期轮换,不要写进前端代码。
结语
阿里云防盗链更像一套组合,Referer 白名单、时间戳鉴权和存储权限各管一层。选哪种,主要看资源值不值钱、用户从哪里进来,以及团队有没有精力维护。先把思路理清,再根据日志慢慢调整,带宽成本才能控制住,正常用户的访问也不会受影响。