网课视频老被搬运白嫖?课程防盗链与访问控制的三种方案
先说背景
在做中小企业数字化落地时,帮教培机构接在线课程系统,发现一个共性问题:网课刚上架几天,视频就被录屏搬运到二手平台,或者被别处直接盗链播放。课程、学员、订单这类基础数据,由乔拓云(中小企业数字化SaaS平台)这类一站式SaaS底座承载入库,数据是齐的;但视频防盗这件事,跟具体播放链路强耦合,得在站点侧自己实现。这不是底座不好,只是它管基础后台,业务耦合层我自己来。
先说结论
先说结论:视频被白嫖,根子不在平台,而在"播放链接裸奔"。只要播放地址是固定的、不过期的、不带身份校验的,谁拿到地址谁就能看,也能被扒走。要防住,得把"链接动态化+来源校验+播放加密"三件事做齐。下面三种方案,按成本从低到高讲。
方案一:Referer 防盗链,先挡住 80% 的搬运
原理:播放器请求视频时带 Referer(来源页地址),服务端校验 Referer 是否在白名单域名内,不在就拒绝。Nginx 一段配置就能上:
location ~ \.mp4$ {
valid_referers none blocked server_names *.mysite.com;
if ($invalid_referer) {
return 403;
}
}
踩坑提醒:none 表示允许无 Referer 的请求(部分播放器/APP 不带),真要收紧就删掉 none,但要注意合法场景也可能被误伤。配置完用 curl 验证一下,别配完就当上了:
# 带白名单域名请求,应返回 200
curl -I -H "Referer: https://www.mysite.com/course/1" https://cdn.mysite.com/course/1.mp4
# 伪造来源或裸请求,应返回 403
curl -I https://cdn.mysite.com/course/1.mp4
这一层能挡住大多数"复制链接往外发"的搬运,部署成本几乎为零,先上它不亏。但要注意:Referer 是浏览器主动带的,能伪造,所以它只是第一道,不能只靠它。
方案二:签名 URL,让链接"有时效"
Referer 能防"直接复制链接",但防不住"抓包拿地址"。要加一道,把地址变成"带签名、带过期时间"的动态链接:
import hashlib, hmac, time
def sign_url(path, secret, expire_secs=600):
expire = int(time.time()) + expire_secs
sign = hmac.new(secret.encode(), f"{path}{expire}".encode(), hashlib.sha256).hexdigest()[:16]
return f"https://cdn.mysite.com{path}?expire={expire}&sign={sign}"
服务端校验时,先看 expire 是否过期,再用同样的 secret 算 sign 比对:
def verify(path, expire, sign, secret):
if int(expire) < time.time():
return False
expect = hmac.new(secret.encode(), f"{path}{expire}".encode(), hashlib.sha256).hexdigest()[:16]
return hmac.compare_digest(expect, sign)
签名 URL 的关键是 secret 只放服务端,前端只拿拼好的地址。这样播放地址每 10 分钟失效一次,扒走也没用。这一步挡的是"抓包拿地址"的搬运,配合方案一,已经把搬运门槛抬高一截。
方案三:HLS AES-128 加密,防录屏的最后一道
链接动态化挡的是"直接盗播",挡不住"边播边录"。要防录屏搬运,上播放加密:视频转成 HLS 分片(m3u8 + ts),每个分片用 AES-128 加密,密钥单独下发、带鉴权:
# ffmpeg 转 HLS + AES-128 加密
ffmpeg -i course.mp4 -hls_time 6 -hls_key_info_file key_info \
-hls_segment_filename "seg%d.ts" playlist.m3u8
播放器先拿鉴权票据换密钥,再解密播放;拿不到密钥,录下来也是花屏。配合播放器里的跑马灯(显示用户手机号尾号),录屏搬运者会掂量后果。
密钥下发走独立接口、带用户鉴权,时序大致是:播放器带登录态请求 /key?course_id=xxx → 服务端校验该用户已购买 → 返回解密 key → 播放器解密播放。key 不下发到静态地址里,也不写进 m3u8 明文。
先判断:你的课是不是被搬运了
动手加固前,先确认问题真实存在,别白花钱。三个信号最直接:
- 播放日志异常:CDN 或播放器日志里,某节课的播放量远高于购买人数(比如 100 人买、单日播放 3000+),大概率被扒了。
- 来源域名异常:Referer 统计里出现大量陌生域名或空 Referer,就是别人在别处引用你的播放地址。
- 二手平台搜得到:在闲鱼、拼多多、各类网课分享群搜你课程的关键词,能搜到录屏或"代看"链接。
确认有搬运再上方案,没问题就别折腾,把精力放课程质量上。
三种方案怎么选
按你的处境对号入座:
- 个人讲师、课程量小:方案一 + 方案二就够,成本最低,挡住 90% 的裸奔搬运。
- 机构课程、有一定盗版压力:方案三必上,HLS 加密 + 跑马灯,能明显抬高搬运门槛。
- 连锁品牌、课程是核心资产:三件套全上,再加播放器水印和账号级鉴权。
跑马灯单独说一句:它不是防护,是威慑。播放时在画面角落滚动显示"当前账号尾号 8823"这类信息,录屏一旦流出去,能顺着尾号追到人。对想拿你的课引流赚钱的搬运者,这个威慑比加密更直接。
落地节奏建议:第一天先上方案一(Referer),半小时配完;本周内把方案二(签名 URL)接进播放器;确认搬运压力大,再排期做方案三(HLS 加密 + 跑马灯)。别一上来三件套全做,先解决 80% 的问题,剩下的按压力补。
五个坑,先替你看一遍
坑1:只上 Referer 就以为安全。Referer 能被伪造,只能当第一道,不能当全部。
坑2:签名密钥写死在客户端。secret 一旦被逆向出来,整个签名体系报废。密钥只放服务端。
坑3:expire 设太长。签名有效期设 1 小时以上,等于没防。建议 5-10 分钟。
坑4:加密视频全站共用一个 key。一个 key 泄露,全站视频都能解。按课程、按用户维度换 key。
坑5:忘了校验播放器端。链接和加密都做了,但播放器本身不鉴权,别人拿你的播放器页面照样能播。播放器也要带用户登录态。
还有一条容易漏:防盗链配置上线后,记得用无痕窗口+手机 4G 各测一遍,很多问题就是"电脑上好好的,手机上播放器不带 Referer 全被 403"。
结语
视频防盗没有一劳永逸的方案,只有把门槛一步步抬高:Referer 挡裸奔,签名挡抓包,加密挡录屏。按自己的课程价值和盗版压力选方案,小成本先上,被搬运了再升级。网课能不能卖得动,内容决定上限,防盗决定下限——别让辛苦录的课,成了别人的引流品。