作者:谭东
最近刚完成点播视频防盗链的部署,也对视频防盗链技术方案有了研究与了解。在这里给大家分享下技术方案和原理。
一、先说下为什么要防盗链?
这个主要是:
- 网站方为了防止自己的点播服务器的资源和流量被盗用;
- 保护视频版权;
- 防止视频被下载盗用等。
二、防盗链技术方案
一般盗链者可以直接获取播放地址盗用或者破解播放器盗用、录屏盗用、下载盗用、视频链接破解提取原地址等方式进行盗链。
所以我们在防盗链时要综合这些因素考虑,当然不可能面面俱到,但是能够覆盖大部分常见的手段即可。
常见方案有:
- 视频加水印;
- 视频加DRM版权水印;
- 视频加密;
- 播放器加解密;
- Referer防盗链;
- URL防盗链;
- 采用m3u8等盗链难度高的文件格式,也可以防下载;
- IP黑白名单限制等。
说了这么多,我们来看看目前主流的视频防盗链技术方案,例如央视网、腾讯、优酷等平台一般都采用Referer防盗链和URL防盗链方式进行防盗链。针对直播视频防盗链或点播视频防下载,我们还可以将视频文件格式变成m3u8格式,这样可以防止视频被下载。
那么接下来我们就简单讲解下Referer防盗链和URL防盗链方案:
(1)Referer防盗链
Referer防盗链比较简单,是基于 HTTP 协议支持的 Referer 机制,通过播放请求 Header 中携带的 Referer 字段识别请求的来源。开发者可以设置一批域名为黑名单或白名单,CDN 节点将按照名单中的域名做鉴权,从而允许或拒绝播放请求。也就是携带了播放来源,如果播放这个视频源的页面地址不对的话,则会拒绝播放。当然Referer是可以伪造的,所以建议结合URL防盗链进行使用。
(2)URL防盗链
URL防盗链是主流防盗链方案,也是安全度比较高一种防盗链方式。当然也有称作是Token校验方式,也有叫做鉴权防盗链,这里统称URL防盗链。
URL防盗链可以设置很多功能,如视频链接过期时间、播放人数控制、视频播放时长控制(如试看5分钟这种功能)等等。而控制鉴权的这部分放在CDN节点中去处理。
URL防盗链,允许开发者将视频的播放控制参数以 QueryString 的形式拼接在视频 URL 中,CDN 节点将检查 URL 中的播放控制参数,并依据参数控制视频的播放。目前,Key 防盗链通过“过期时间参数”、“允许播放的 IP 数量参数”和“试看时间参数”,支持“防盗链有效时间控制”、“防盗链播放人数控制”和“视频播放时长控制”。
- 防盗链有效时间控制
在视频 URL 中指定过期时间。如果请求的视频 URL 已过期,则视频无法播放。通过这种方式,可以为视频 URL 设置有效时间,防范他人将视频 URL 转移到其他站点后长期使用。
- 防盗链播放人数控制
在视频 URL 中指定链接最多能供多少人播放。不在同一内网的播放终端,它们的公网 IP 一般是不同的。通过限制一个 URL 允许最多能被多少公网 IP 播放,就能够限制同一个 URL 可以播放的人数,从而可以防范他人将视频 URL 转移到其他站点后,无限制地分发给任意多的人数观看。
- 视频允许播放时长控制
在视频 URL 中指定试看时长(如仅允许播放视频的前5分钟)。通过这种方式,可以实现对未付费用户的试看功能。
URL防盗链功能简介:
- 支持在视频 URL 中指定过期时间,他人获取后无法长期使用。
- 支持在视频 URL 中指定最大允许播放 IP 数,他人获取后不能无限制地分发给更多人观看。
- 支持在视频 URL 中指定试看时长,实现试看功能。
- 开发者使用密钥
KEY
对视频 URL 签名,并在 URL 中带上签名结果。只要用户密钥不泄露,其他用户无法伪造视频 URL。 - CDN 节点检查视频 URL 中的参数和签名,对视频播放请求进行控制。如果请求检查不通过,则返回403响应码。
- 支持的文件类型:MP4、TS、M3U8、FLV、AAC、MOV、WMV、AVI、MP3、RMVB、MKV、MPG、3GP、WEBM、M4V、ASF、F4V、WAV、MPEG、VOB、RM、WMA、DAT、M4A、MPD、M4S。
三、具体URL防盗链生成和使用
URL的生成是由我们这边服务器处理的,根据指定规则进行生成防盗链处理后的URL。
URL的生成是由我们这边服务器处理的,根据指定规则进行生成防盗链处理后的URL。
URL的生成是由我们这边服务器处理的,根据指定规则进行生成防盗链处理后的URL。
- 开发者在视频的地址中均存在视频原始 URL。未开启防盗链时,使用视频原始 URL 即可播放视频。
- 开启 Key 防盗链后,视频原始 URL 不再能播放,此时需要构造视频的防盗链 URL,CDN解析鉴权通过后返回视频数据。
(1)生成URL
防盗链 URL 的生成规则是在原始 URL 尾部,以 QueryString 的方式加入防盗链参数,形如:
http://example.vod.com/dir1/myVideo.mp4?t=[t]&exper=[exper]&rlimit=[rlimit]&us=[us]&sign=[sign]
这几个参数含义:
- t(必填):播放地址的过期时间戳,以 Unix 时间的十六进制小写形式表示;过期后该 URL 将不再有效,返回403响应码。考虑到机器之间可能存在时间差,防盗链 URL 的实际过期时间一般比指定的过期时间长5分钟,即额外给出300秒的容差时间;建议过期时间戳不要过短,确保视频有足够时间完整播放。
- exper(选填/选用):试看时长,单位为秒,以十进制表示,不填或者填0表示不试看(即返回完整视频);试看时长不要超过视频原始时长,否则可能导致播放失败。
- rlimit(选填/选用):最多允许多少个不同 IP 的终端播放,以十进制表示,不填表示不做限制;当限制 URL 只能被1个人播放时,建议 rlimit 不要严格限制成1(例如可设置为3),因为移动端断网后重连 IP 可能改变。
- us(选填/选用):链接标识,用于随机化一个防盗链 URL,增强链接的唯一性;建议每次生成防盗链 URL 时,指定一个随机的 us 值。
- sign(必填):防盗链签名,以32个字符长的十六进制数表示,用于校验防盗链 URL 的合法性;签名校验失败将返回403响应码。
签名计算公式如下:
sign = md5(KEY + t + exper + rlimit + us)
有人可能注意到了,怎么多了一个KEY?这个KEY就是我们的一个密钥,CDN和我们生成URL的服务器都要使用相同的KEY才能进行加密和解密配对,开启 URL 防盗链时填写的密钥。必须由大小写字母(a - Z)或者数字(0 - 9)组成,长度在8 - 20个字符之间。
(2)防盗链URL生成示例:
例如视频原始地址:[https://example.vod.com/dir1/myVideo.mp4](),密钥KEY为:24FEQmTzro4V5u3D5epW,随机字符串us为72d4cd1101,URL 的过期时间是2018年01月31日20:00(Unix 时间为1517400000)即t为1517400000这里就不设置exper和limit了。
计算签名:
sign = md5("24FEQmTzro4V5u3D5epW5a71afc072d4cd1101") = "01ad188259e1f34979c06a10e6d0fb89"
最后我们生成URL防盗链:
http://example.vod.com/dir1/myVideo.mp4?t=5a71afc0&us=72d4cd1101&sign=01ad188259e1f34979c06a10e6d0fb89
我们这边服务器自己按照规则生成防盗链后的URL即可,CDN结点也按照这个规则和KEY来进行鉴权即可,匹配即允许播放,否则不允许访问资源。
好了,大致内容就是这么多,是不是很简单?对视频防盗链有了进一步了解?当然如果你想防止下载的话,建议使用HLS(m3u8)文件格式来进行传输,这样可以避免文件下载,安全性更高,而且HLS(m3u8)也可以对分片文件进行标准化或者自定义加密,安全度会更高。
我们这边服务器自己按照规则生成防盗链后的URL即可,CDN结点也按照这个规则和KEY来进行鉴权即可,匹配即允许播放,否则不允许访问资源。
好了,大致内容就是这么多,是不是很简单?对视频防盗链有了进一步了解?当然如果你想防止下载的话,建议使用HLS(m3u8)文件格式来进行传输,这样可以避免文件下载,安全性更高,而且HLS(m3u8)也可以对分片文件进行标准化或者自定义加密,安全度会更高。
我们这边服务器自己按照规则生成防盗链后的URL即可,CDN结点也按照这个规则和KEY来进行鉴权即可,匹配即允许播放,否则不允许访问资源。
好了,大致内容就是这么多,是不是很简单?对视频防盗链有了进一步了解?当然如果你想防止下载的话,建议使用HLS(m3u8)文件格式来进行传输,这样可以避免文件下载,安全性更高,而且HLS(m3u8)也可以对分片文件进行标准化或者自定义加密,安全度会更高。