一、基础防盗链
基础防盗链主要是针对客户端请求过程中所携带的一些关键信息来验证请求的合法性, 比如客户端请求IP,请求URL中携带的referer。优点是规则简单,配置和使用都很方便,缺点是防盗链所依赖的验证信息很多都是可以伪造的,因此此类防盗链可靠性较低。
1、IP 访问控制
原理:
IP地址在互联网上具有唯一性,通常客户端在请求过程中,IP地址保持不变,客户端向服务端(CDN节点)发起请求时,服务端可以明确获取到客户端的IP地址,因此可以利用IP 地址的这些特点进行访问控制。
1、支持1个或多个IP的访问控制(黑名单或白名单)
2、支持针对IP段进行访问控制(通常采用IP+子网掩码的表示方式,比如192.168.1.0/24)
3、支持区域访问许可。比如,禁止或允许某些地区的用户(根据访问者的IP所在的地理位置)访问某些特定的资源,常用于版权保
适用场景举例:
1)发现某些IP地址访问次数巨大,属于不正常的访问或者可能是某种攻击行为,这种情况下可以考虑将该IP地址加入黑名单,此IP地址访问到CDN的节点时会被直接拒绝。
2)加速的内容属于公司或者企业的员工内部使用,不希望被企业之外的其他人访问到。企业通常有固定统一的出口IP地址,因此可以将这些出口IP加入白名单,只允许白名单中的IP访问,其他所有IP都将被拒绝。
3)有些特殊的资源只希望北京地区的用户使用,禁止其他地区的用户使用,可以使用地区访问许可的功能。
2、Referer 防盗链
原理:
Referer在HTTP协议里有特殊的用途,当浏览器向服务器发送请求时,一般会带上Referer头,告知服务器该请求是从哪个页面链接过来的。Referer经常被用于页面访问统计、图片防盗链等。
流媒体直播同样支持Referer防盗链,当请求发送到CDN服务器后,CDN服务器检查客户URL中所携带的Referer字段的信息,禁止或者允许符合特定规则(支持正则匹配)的Referer的请求。
适用场景举例:
某直播客户,通过referer做防盗链。比如http://cdn.example.com/,访问该页面下的所有直播流时,比如http://cdn.example.com/live1.flv,浏览器在请求时会自动带上Referer:http://cdn.example.com/表明请求的来源地址。
注意事项:
1) 在使用Referer防盗链功能时,应该特别注意指明空引用的处理方式(空引用是指http请求头中没有携带Referer头部,通常是直接在浏览器地址栏访问某个url或者通过非浏览器的方式访问某个url时,请求头部不会带有referer头部;),默认禁止空引用。
2) Referer很容易伪造,因此referer防盗链安全性较低。
二、高级防盗链
流媒体直播中,高级防盗链主要是指时间戳防盗链、swf防盗链、回源鉴权防盗链。 时间戳防盗链的特点是加密的url具有时效性,无法伪造,当达到过期时间后url不再被允许访问,适合一些对“时效性”有要求的场景,使用时需要内容提供商和CDN配合,内 容提供商负责生成加密的url,CDN负责根据预先设定的规则对url进行合法性验证。时间戳防盗链由于实现原理简单、可靠性高,推荐使用。
Swf防盗链为RTMP协议所特有,其特点为需要客户提前将SWF文件上传至CDN节点, 由客户端和CDN节点在请求过程中基于一定机理进行加密和解密验证,CDN验证通过则响 应用户请求,验证失败则拒绝用户请求。
回源鉴权的特点是CDN节点每次接收到的请求,都需要先回源进行验证,验证通过后才认为请求合法,继续提供服务,适用于对防盗链有很高的实时性要求的场景。另外,一些特殊性的防盗链,CDN默认不支持的情况下也可以考虑采用回源鉴权的形式。
1、时间戳防盗链
原理:
1、当用户发起请求时视频请求时,用户的请求会被引导至客户源站。例如,终端用户发起的请求url为:http://www.example.com/test.flv
2、客户源站通过一系列参数共同加密生成一串密文。
3、终端用户利用客户源站返回的url,重新向服务商节点发起请求。
4、服务商节点进行验证:请求是否过期以及加密串是否匹配。
目前服务商支持绝对时间和相对时间两种方式的时间戳防盗链控制。
绝对时间控制方式原理如下:
此方式下用于生成密文的参数有过期时间wsABSTime、请求直播流、服务商key(由服务商提供)、IP地址串。假设过期时间为:4d024e80,用户请求的直播流为:test.flv,服务商key为:abc,ip地址为192.168.1.1,则以上数据经过md5加密后,生成的密文为:84579e4b82787870e418004c59f696b0, 则 客 户 源 站 返 回 给 终 端 用 户 的 url 为 : http://cdn.example.com/test.flv?wsSecret=84579e4b82787870e418004c59f696b0&wsABSTime=4d024e80
终端用户利用客户源站返回的url,重新向服务商节点发起请求,发起请求的url为: http://cdn.example.com/test.flv?wsSecret=84579e4b82787870e418004c59f696b0 & wsABSTime =4d024e80
服务商节点进行验证:
a) 根据过期时间wsABSTime和当前时间进行比较,确认请求是否过期
b) 根据约定的md5计算方式和密文,计算出md5加密串后和url中原始的加密串进行比较。
只有a)和b)都验证通过,请求才会被认为是合法的。不合法的请求可以采取禁止访问或者302重定向到指定的url。
相对时间控制方式原理如下:
与绝对时间控制方式相比,相对时间控制方式使用参数keeptime和wsTime来共同决定过期时间,wsTime表示终端用户向源站请求url时,源站的机器时间,keeptime表示url 有效的时间长度,以秒为单位,以十六进制或十进制表示,同时keeptime作为参数加入加密 串 的 计 算 ; 例 如 : rtmp://rtmpup4.pstatp.com/live/xxxxxx/xxxx?wsSecret=xxx&keeptime=7200&wsTime=xxx。
服务商节点在进行url请求是否过期时,判断方式如下: 当前时间-wsTime< keeptime ,则url请求未过期;
当前时间-wsTime>= keeptime ,表示url请求已过期;
若keeptime为空,则按照发布点配置的默认过期时间来进行判断(如5分钟)。同样,相对时间控制方式除校验有效期之外,也需要校验md5加密串是否匹配。
使用方法:
1、需要确认的信息
a) 确认时间的表示格式。默认采用的是Unix时间戳的形式,比如1371982466表示时间是2013-06-23 18:14:26,支持其他一些时间表达格式,比如:
i. 20130623181426
ii. 2013-06-23
iii. 51c6ca82(推荐此表示方式,将十进制的1371982466采用16进制表示,,有较好的隐蔽性)
b) 需要确认使用绝对时间还是相对时间控制方式,使用相对时间控制的话还需要确认是否需要使用keeptime,不使用keeptime需要与客户确认默认配置的过期时长。
c) 确认参与md5计算的相关参数,以及组合顺序。
应用场景举例:
1、适用于对url有一定时效性的场景
2、如果在md5加密算法中添加客户端的ip,可以防止用户观看视频后直接将获取到的视频URL粘贴分享出去,提供给他人播放。客户端的ip也可以通过url中的参数传递。
注意事项:
1)时间戳防盗链默认支持,可以直接配置,不需要再次开发
2)当防盗链涉及的参数发生变更时,需要通知CDN进行配合更改,原则上密文一旦确定尽量不要发生变动,不然可能导致源和加速节点使用的密文不一致,请求全部验证不通过
3)使用IP进行md5计算可能带来一些问题:如果加密使用的IP1,而到CDN这边用的是另外一个IP2,这样就会被禁止访问。
2、swf 防盗链
原理:
用户需要将播放视频对应flash播放器的SWF文件提前交由CDN,CDN会将该文件提前分发至CDN节点。用户播放器端,必须为flash播放器。
1、终端用户向CDN节点请求RTMP视频播放。例如: RTMP://www.test.com/live/channel
2、 CDN节点在接收到用户RTMP请求时,会对域名进行判断是否需要进行SWF防盗验证。若需要进行防盗链验证,则向播放器端发送相应的SWF密钥。该密钥由CDN节点生成。
3、用户播放器端,将SWF文件,及CDN发送给播放器的SWF密钥,利用加密算法HMACsha256,生成一个加密值,并回传给CDN节点。
4、 CDN节点用客户提交给CDN的SWF文件,结合发送给终端用户的SWF密钥,利用加密算法HMACsha256,生成一个加密值,与播放器端回传给CDN的KEY文件进行比对。若比如结果一致,则响应用户播放请求;若比对结果不一致,则拒绝用户播放请求。
应用场景举例:
1、该验证过程是在rtmp协议的握手过程中完成,故仅适用于adobe播放器的rtmp协议。
2、客户对防盗链需要比较高,又不愿意进行开发时,可直接使用adobe播放器所自带的swf防盗链。
注意事项:
1、用户需要提前将SWF文件提交到CDN,并确保提交至CDN的SWF文件与播放器端的
SWF文件一致。
2、确认加密算法。
3、步骤二中,的SWF密钥生成难度需要适配不同的SWF,属于高度定制化。
3、回源鉴权防盗链
原理:
1、终端用户向CDN请求视频内容,在请求中携带需要回源鉴权的参数。例如: http://www.test.com/live/channel.flv?key1=vaule1&key2=vaule2
2、 CDN节点可通过POST或者GET方式向用户鉴权服务器返回需要鉴权的参数,鉴权参数需要用户提前告知CDN。
3、鉴权服务器根据CDN传送而来的鉴权信息,进行防盗链判断,决定是否允许用户请求该直播视频,并将结果返回给CDN节点。
4、 CDN节点根据客户鉴权服务器返回的结果,响应或者拒绝终端用户的视频请求。
应用场景举例:
1、客户技术实力比较强,又不希望第三方公司知悉其防盗链原理时,可使用回源鉴权防盗链。
2、 CDN无法满足客户特殊防盗链需求时,可使用回源鉴权防盗链。
使用方法:
1、告知CDN,回源鉴权的参数
2、告知CDN,鉴权服务器地址。
3、告知CDN,回源鉴权的方式,目前支持get及post两种
4、告知CDN,鉴权结果,例如1代表成功,0代表失败
5、告知CDN,超时等待时间,及超时如何处理,例如,鉴权服务器3S不响应,就同意请求,或拒绝请求。
注意事项:
1、每次请求都需要先进行鉴权,在请求量较大时,需要考虑鉴权服务器的压力
2、该鉴权形式客户需要维护专门的鉴权服务器。