直播平台防盗链探究

作者 | 张高旭 中国农业银行研发工程师

曾婷婷 中国农业银行研发工程师

责编 | Carol

随着音视频技术的飞速发展,直播已成为当下最为炙手可热的技术。然而如何保障资源不被盗用,如何防止用户非法接入,对于直播平台至关重要。本文简要介绍了当下主流的几种防盗链,并对其机制进行了详细的分析,对直播平台的安全建设具有一定的参考价值。

为什么要有防盗链

当前国内直播平台百家争鸣,既有提供直播云服务的七牛云直播,腾讯云直播,也有提供应用的斗鱼直播,抖音直播。我们也基于开源直播框架搭建了一套直播平台,并实现了直播的一些功能。然而随着功能的不断完善,应用的不断扩大,也面临着如何保证私有资源不被别人窃取的问题。试想一下,如果教育网站的视频被人随意引用,这些作者的辛苦付出将付之东流;如果公司的直播服务被人随意接入,公司经营者将会遭受巨大的损失。由此防盗链技术应运而生,它能最大限度的防止资源被未授权的人轻易盗用,从而保障我们的利益不被侵犯。

主流防盗链介绍

目前,业内主流防盗链的实现方式主要有以下几种:

防盗链名称

规则简介

IP防盗链

按照IP地址黑白名单来控制访问者的范围。

Referer防盗链

利用http请求头的Referer字段来防止资源被其他站点非法引用。

User-Agent防盗链

只允许特定的浏览器或专属客户端进行访问

回源鉴权防盗链

利用动态令牌对访问资源的请求进行回源鉴权,从而保证资源不被未授权用户盗用。

时间戳防盗链

基于MD5加密的时间戳对资源的可访问时间进行限制。

其中IP防盗链、Referer防盗链、User-Agent防盗链主要是利用普通客户端请求中所携带的一些关键信息来进行验证,其配置规则和实现原理都比较简单,由于这些关键信息都可能会被伪造,因此其可靠性较低。时间戳防盗链是基于加密时间戳来实现的,其资源访问具有时效性,可靠性相对较高,且比较容易与CDN结合,是目前使用最为广泛的防盗链技术。回源鉴权防盗链基于动态令牌来限制资源的访问,具有很强的实时性,最为安全,但实现相对复杂,且对服务器性能具有较高要求。下面我们将对各防盗链原理进行探究。

IP防盗链

IP防盗链是基于访问者IP地址进行访问限制的一种防盗链实现。由于在用户发起请求时,服务端可获取到客户端的IP地址。基于预先设定好的IP地址黑白名单,服务端将对客户端的IP进行过滤,在允许范围内的客户端可成功访问资源,而黑名单中的客户端将无法获取到资源,从而达到防盗的效果。其主要应用于一些有限范围IP的访问控制,如公司内部员工的使用,某个区域的用户使用等。

Referer防盗链

HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器该网页是从哪个页面链接过来的,服务器因此可以获得一些信息用于处理。如图所示,其Referer为www.baidu.com。因此可通过检查请求中的Referer信息,来对资源的请求进行控制,防止资源被其他网站恶意引用。其主要用于图片等一些静态资源的防盗控制,但由于其较易被伪造,因此安全性不高。

User-Agent防盗链

User Agent是用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。通过对客户端的User Agent进行过滤,可以限制访问资源的类型。同样,与Referer类似,由于User-Agent很容易伪造,因此其防盗链安全性也较低。

回源鉴权防盗链

回源鉴权防盗链是一种实时性、安全性很高的防盗链机制。当客户端请求资源服务器资源时,资源服务器会将收到的请求按照一定规则转发至业务服务器进行验证,如果验证通过则认为是合法请求,否则将拒绝本次资源请求。由于每次资源请求都需要回源到业务服务器进行鉴权,因此会增大系统的复杂度,增加客户端访问资源的等待时间,且会对业务服务器带来较大的压力。其过程大致如下图所示:

时间戳防盗链

时间戳防盗链是基于加密时间戳的一种防盗链,其每一个请求的url都具有一定的有效时间,当超过有效时间后,请求所对应的资源将无法继续被访问,因此它是一种相对安全可靠的防盗链机制。时间戳防盗链的url本身由于既要包含过期时间等相关信息,还要保证过期时间不被篡改,因此通常采用MD5算法对secret、过期时间expire、文件路径path等信息进行加密得到签名并加入url中,并在验证端(通常是CDN)进行验证。其整个过程通常分为以下几个步骤:

  1. 客户端发送原始资源请求给业务服务器。

  2. 业务服务器根据约定的算法计算防盗链签名sign,如sign = md5(secret + path + expire)。

  3. 业务服务器将带有防盗链签名、过期时间等信息的url返回至客户端。

  4. 客户端使用带有时间戳签名的url请求对应的资源。

  5. 资源方从url中获取相应信息,首先校验过期时间,若未过期则按照约定算法计算签名并与url中的sign进行比对,若一致才认为是有效请求。以上两点若存在一点不满足的情况,则认为是无效请求。

如下图,我们给出七牛云官方时间戳防盗链的生成,其最终访问url为:

http://xxx.yyy.com/DIR1/%E4%B8%AD%E6%96%87/vodfile.mp4?v=1.2&sign=b4b7f94dd7817ce0283b5491861c3936&t=55bb9b80

在资源方接收到请求时,会先校验过期时间55bb9b80,若当前时间不晚于20150801 00:00:00,则计算下值:

md5(9388f4ba63b89bba5b9b84aa70a92eaac099d39b/DIR1/%E4%B8%AD%E6%96%87/vodfile.mp455bb9b80) .to_lower(),若其值等同于b4b7f94dd7817ce0283b5491861c3936,则验证通过并返回相应的资源,否则将禁止客户端的访问。

总结

文章介绍了当前主流的几种直播平台防盗链技术,并详细阐述了其工作机制,为直播平台的安全性建设提供了参考。此外,这些防盗链技术并非是只能单一使用,而是可以根据业务需求进行评估,从中选择几种结合使用,从而最大限度的保护资源不被恶意的盗用。

比如在直播业务中,推流主播端所需安全性较高,而数量通常较少;拉流观众端人数较多,但安全要求不高。因此可采用回源与时间戳结合的方式,在直播推流时采用回源方式,确保推流的安全可靠,而在拉流端采用时间戳的方式,保证直播流不会被未经授权的人随意获取到,且对于业务服务端并不会带来更大的压力,从而满足业务的各项需求。

作者简介:

张高旭,研发工程师,就职于中国农业银行研发中心,从事即时通讯等领域研发工作; 

曾婷婷,研发工程师,就职于中国农业银行研发中心,从事即时通讯等领域研发工作;


热门文章

暂无图片
编程学习 ·

PCL点云焊点提取

滚回来更新一篇文章,和各位交流一下 待处理点云: 数量级:百万 类型:零部件 描述:弯曲表面上有一些凸起在上面,需要提取凸起和平面接触的一圈点云,作为焊接的加工点参考:https://zhuanlan.zhihu.com/p/32111069其实这篇文章也算是全面了,思路和他的差不多,只是算法不太一…
暂无图片
编程学习 ·

Python学习:变量

Python 变量类型 变量存储在内存中的值。这就意味着在创建变量时会在内存中开辟一个空间。 基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中。 因此,变量可以指定不同的数据类型,这些变量可以存储整数,小数或字符。变量赋值 Python 中的变量赋…
暂无图片
编程学习 ·

python读取excel文件(xlrd)

调包import xlrd打开文件data = xlrd.open_workbook(文件名.xlsx)查看页名print(data.sheet_names())输出sheet1、sheet2等页名,一般用不上,因为可以用下表取页获取某页sheet = data.sheet_by_name(sheet1) sheet = data.sheet_by_index(0)两个方法都行,一般用第二个,因为第…
暂无图片
编程学习 ·

Python之OpenCV的学习(一)

一.安装 打开Pycharm:File -> Settings -> Project:xxxx下的Project Interpreter,如图所示然后,点击右边的加号进行搜索点击左下角Install Package即可 如果搜索不出来,可以看一下是不是pip源的问题 点击Manage Repositories我使用的是豆瓣pip源:http://pypi.douba…
暂无图片
编程学习 ·

浅析原型模式中的clone()

更多精彩文章请访问我的个人博客(zhuoerhuobi.cn)最近学习到设计模式中的原型模式,在学习过程中,产生了对clone()实现的原理和效率的兴趣。原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的…
暂无图片
编程学习 ·

【Android 内存优化】Bitmap 图像尺寸缩小 ( 考虑像素密度、针对从不同像素密度资源中解码对应的 Bitmap 对象 | inDensity | inTargetDensity )

文章目录一、像素密度对解码图片的影响二、不考虑像素密度会导致图片缩小尺寸不准确三、DisplayMetrics 源码阅读、研究手机资源获取规则四、像素密度参数设置取值 ( inDensity | inTargetDensity | setDensity )五、inDensity 与 inTargetDensity 设置六、新的图片缩小工具类代…
暂无图片
编程学习 ·

致敬建党99年 | 不忘初心,砥砺前行

致敬建党99年 | 不忘初心,砥砺前行 七一建党节(1921-2020) 听风雨飘摇,看沧桑巨变 一个民族的图存、崛起、强盛 离不开一代代中华儿女的奋斗与牺牲 在此 热烈庆祝中国共产党成立99年共产党一路走来,始终坚持了为中国人民谋幸福、为中华民族谋复兴的初心和使命。 这一份不忘…
暂无图片
编程学习 ·

挂牌一年,关于 5G 的 9 个变化

简介:2019 年 6 月 6 日的一张新闻图片瞬间刷遍全网,意味着中国正式进入 5G 时代,2019 年也被业界称为 5G 商用元年。转眼间一年过去,这个不断被提及的 5G 新星发展到了什么程度呢,让我们再来回顾和展望一下。3GPP 标准进展移动通讯网络作为全球的基础设施,标准化是基础,…
暂无图片
编程学习 ·

unordered_map/unorderd_set使用与哈希介绍

在C++98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时效率可达到 O(logN),即最差情况下 需要比较红黑树的高度次,当树中的节点非常多时,查询效率也不理想。最好的查询是,进行很少的比较次 数就能够将元素找到,因此在C++11中,STL又提供了4个unordered系列的…
暂无图片
编程学习 ·

什么是语音直播源码,语音下直播系统可以做什么?

语音直播源码是指用户能够通过语音进行聊天的软件功能。语音直播源码的形式多样化的,现在市场上也出现了很多很多语音形式的源码出现,比如,可以多人语音聊天,语音视频通话,语音直播,语音教学还有很多的语音游戏,像最近很多的和平精英,王者荣耀,狼人杀之类的,都是在游…
暂无图片
编程学习 ·

AppcompaActivity 相对于 Activity 的区别

1、AppcompaActivity 带 ActionBar 标题栏,Activity 则不带。参考文档显示ActionBarActivity已经过时,使用AppCompatActivity代替。2、theme 主题只能用 android:theme=”@style/AppTheme (appTheme主题或者其子类),不能使用 android:style。
暂无图片
编程学习 ·

【Hadoop篇08】Hadoop数据压缩

简洁而不简单Hadoop数据压缩 数据压缩优点和缺点 ​ 压缩技术能够有效减少底层存储系统(HDFS)读写字节数。压缩提高了网络带宽和磁盘空间的效率。在 Hadoop下,尤其是数据规模很大和工作负载密集的情况下,使用数据压缩显得非常重要。在这种情况下,IO操作和网络数据传输要…
暂无图片
编程学习 ·

FPGA之fifo设计

FPGA之手撕fifo(含设计代码和仿真)本文回答以下几个问题:1:fifo的读空和写满信号如何给出2:fifo的写控制模块设计3:fifo的读控制模块设计4:双口RAM使用5:顶层文件6:仿真文件编写7:modelsim的RTL仿真1:上一篇文章(FPGA之FIFO IP核详细教程)已经简单说了一下读写指针…
暂无图片
编程学习 ·

Java 语言中关键字“static”的理解和应用详解

接触Java编程语言的初学者们,都是熟悉static这个关键词的,至少混个脸熟了已经。涉及到它的概念、或解释,我们都是知道它表示“静态”、甚至了解“静态存储区”。它可以应用到:属性 方法 代码块 还可以做“静态导入” 内部类 一、static修饰的属性,我们亦称之为“静态变量”…
暂无图片
编程学习 ·

selenium+ChromeDriver+java爬虫初探

selenium+ChromeDriver+java爬虫初探seleniumChromeDriver简单的demo selenium 自动化测试工具,可以完全模拟人的行为。我们可以用它来打开浏览器,访问指定URL,并且定位到具体的按钮,点击触发事件等等。ChromeDriver selenium和谷歌浏览器交互,需要这个驱动。下载地址(ht…
暂无图片
编程学习 ·

安装JDK

安装JDK 前提 要准备好jdk的包:jdk-8uxxx-linux-x64.tar.gz //JAVA 8 版本都可以 笔者这里使用的171 下载地址:Java SE 8 存档下载. 步骤 一、 解压jdk:tar -zxvf jdk-8u171-linux-x64.tar.gz二、 设置环境变量,编辑文件添加如下: vi /etc/profile export JAVA_HOME=/us…
暂无图片
编程学习 ·

Day03 数据类型转换 +墨子

学习python的第三天墨子 墨子,名翟,春秋战国之际的思想家,墨家的创始人。 墨子反对不义之战,广收门徒周游列国,在百家争鸣的战国产生了很大的影响。墨子还是一位高明的工匠,谙熟各种机械工程技艺,为了止楚攻宋,曾与名匠公输般(鲁班)进行攻防演练,使对方折服。他还详…
暂无图片
编程学习 ·

HashMap的高效遍历方式

HashMap<Integer,Integer> map = new HashMap<>(); 第一种(直接keySet()或者values()遍历): for(Integer key:map.keySet()){System.out.println("key:"+key+",value:"+map.get(key)); }第二种(使用entrySet,底层也使用的迭代器,高效):…