直播平台防盗链探究

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

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

责编 | 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,则验证通过并返回相应的资源,否则将禁止客户端的访问。

总结

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

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

作者简介:

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

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


热门文章

暂无图片
编程学习 ·

数据结构学习笔记-队列长度的计算

1.通用计算公式:l=(rear-front+n)%n其中:l为当前队列的长度rear为队列尾指针front为队列头指针n为队列可容纳的元素总数(即队列大小)2.公式解析队列中存在一种特殊情况:循环队列,一般定义循环队列的头指针front和尾指针rear均指向队列下标为0的位置,此时front=rear&…
暂无图片
编程学习 ·

Linux 文件系统解析(三)cache

Linux文件系统中使用了大量cache,用于提升IO性能,本篇来梳理一下这些与文件系统相关的cache,它们在内存中是如何组织管理的,它们是如何加速文件系统操作的。Dentry Cachedentry用于描述系统目录树中的一个节点,磁盘文件系统中通常没有相关结构,dentry只存在于内存之中,它…
暂无图片
编程学习 ·

Docker 2375 端口入侵服务器,部分解决方案

docker remote API的同学对2375端口入侵服务器2375->上传镜像-》获取控制权-》ssh pub key 注入-》登入服务器核心总结:1.禁用2375 2.创建linux新用户 3.禁止root远程登录4.卸载重新安装docker,并删除之前的文件5.禁止外网一、创建新用户以及授权创建用户adduser limp用户…
暂无图片
编程学习 ·

RabbitMQ 教程

RabbitMQ 教程 文章目录RabbitMQ 教程消息中间件安装及管理windows安装:RabbitMQLinux安装Mac安装基本概念主要概念Exchange的类型RabbitMQ的工作模式及代码示例简单模式 Simple2.工作模式 work (资源竞争消费)3.发布订阅 publish/subscribe (广播)4.路由 routing5.主题订阅…
暂无图片
编程学习 ·

Hadoop----HDFS的API操作

HDFS文件上传 1、源代码` @Test public void testCopyFromLocalFile() throws IOException,InterruptedException,URISyntaxException{//1、获取文件系统Configuration configuration = new Configuration();configuration.set("dfs.replication","2");//副…
暂无图片
编程学习 ·

树莓派4B介绍及其系统安装 入门教程(一)

树莓派4B介绍及其系统安装 入门教程(一)树莓派介绍系统下载安装连接外设启动后续计划入门进阶扩展参考资料 树莓派介绍 树莓派介绍可以参考链接: 树莓派介绍。里面介绍的很详细了,这里就不重复讲了,也可以去树莓派官方网站下载它的参数资料,里面也有很多利用树莓派设计制作…
暂无图片
编程学习 ·

PHP字符串函数vsprintf(返回格式化字符串)

在PHP中,字符串函数 vsprintf() 返回格式化字符串。函数语法:vsprintf ( string $format , array $args ) : string函数参数说明:参数描述format必需。规定字符串以及如何格式化其中的变量。可能的格式值:%% - 返回一个百分号 %%b - 二进制数%c - ASCII 值对应的字符%d - 包…
暂无图片
编程学习 ·

线程池:ThreadPoolExecutor

github地址: https://github.com/lishanglei/thread-pool.git 源码 public ThreadPoolExecutor(int corePoolSize, //核心线程数int maximumPoolSize,//最大线程数量long keepAliveTime, //线程存活时间TimeUnit unit, //线程存活时间单位 BlockingQueue<Runnable> w…
暂无图片
编程学习 ·

Python简介和安装

Python简介 Python是一种跨平台的计算机程序设计语言。是由荷兰著名的“龟叔(Guido van Rossum)在1989年圣诞节期间,为了打发无聊的圣诞节而编写的一个编程语言,是用龟叔喜欢看的一个马戏团来命名。在TIOBE排行榜中Python,C语言和JAVA一直位于前三甲,是非常流行的编程语言…
暂无图片
编程学习 ·

自适应核回归算法讲解

该文是对07年论文“Kernel Regression for Image Processing and Reconstruction”的总结性介绍。对于初学者来说,首先要搞明白“核回归”是什么意思。所谓“回归”可以简单地理解为对样本值的拟合。在目标函数中,通常会给不同样本值误差分配不同的权重,决定权重分配的函数即…
暂无图片
编程学习 ·

每天一刷20200701

今天7.1号也要加油哦 问题 题目描述 实现删除字符串中出现次数最少的字符,若多个字符出现次数一样,则都删除。输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序。 注意每个输入文件有多组输入,即多个字符串用回车隔开 输入描述: 字符串只包含小写英文字母, 不考…
暂无图片
编程学习 ·

【整理】信息安全系统与技术课程复习整理

难得自己整理……信息系统安全与技术选择 15 填空 15 名词解释 4*6 简答 6*6 方案设计 10根据信息流动过程划分的安全威胁:中断威胁、截获威胁、篡改威胁、伪造威胁。 CIA安全需求模型:保密性(Confidentiality)、完整性(Integrity)、可用性(Availability)。 信息保障体…
暂无图片
编程学习 ·

趣谈:C++中引用和只指针的区别

1.引用必须初始化,不可以为空,不可以null;指针可以位NULL,可以在任何时候初始化. 2.引用一生只爱一次,一生只爱一个人,一旦绑定一个对象,就不能换对象;指针是情场老手,可以随意的更换对象. 3.引用沉溺爱情,丧失了自己,如果使用sizeof(&),返回的是他对象的大小,而指针是他自…
暂无图片
编程学习 ·

RPC框架正确的使用姿势

RPC框架-Thrift介绍RPC(Remote Procedure Call)远程过程调用,简单的理解是一个节点请求另一个节点提供的服务;本地过程调用:如果需要将本地student对象的age+1,可以实现一个addAge()方法,将student对象传入,对年龄进行更新之后返回即可,本地方法调用的函数体通过函数指…
暂无图片
编程学习 ·

靶机实战(DC-4)

DC-4实验环实验过程信息收集主机发现端口扫描服务发现网站指纹漏洞发现漏洞利用提权总结 实验环 靶机:DC-4 测试机:kali(IP:192.168.186.128),win10 实验过程 信息收集 主机发现 netdiscover -I eth0 -r 192.168.186.0/24 nmap -sn 192.168.186.0/24 arp-scan -l ,arp-sc…
暂无图片
编程学习 ·

caller和callee的区别

callee caller返回一个函数的引用,这个函数调用了当前的函数。 使用这个属性要注意这个属性只有当函数在执行时才有用 如果在javascript程序中,函数是由顶层调用的,则返回nullfunctionName.caller: functionName是当前正在执行的函数。 function a() {console.log(a.caller)…
暂无图片
编程学习 ·

【Flink】Object Reuse 模式(Stream API)

1. 概述昨天在界面上看到一句话,主管让加上去,于是我去查查这个参数有什么用 官网:https://ci.apache.org/projects/flink/flink-docs-stable/dev/execution_configuration.html enableObjectReuse() / disableObjectReuse() By default, objects are not reused in Flink. …
暂无图片
编程学习 ·

mxnet安装环境配置

一、安装Miniconda 官方网址:https://conda.io/en/latest/miniconda.html 本人选择python3.7版本Windows64位 安装完成后打开Anaconda Prompt创建虚拟环境conda create –n env python=3.7 这里的env为自定义环境名激活环境 conda activate env 退出环境: conda deactivate查…