目录

1 前言

2 什么是防盗链

3 为什么直播使用防盗链

4 http callback

5 直播防盗链实施

5.1 api准备

5.2 配置api

5.2.1 api配置注意事项及问题

5.3 防盗链

 5.4 防盗参数获取

6 加入防盗链后的SRS的推流流程


1 前言

前面的文章,已经完成了基于SRS的直播的实现的所有技术细节。从这一篇开始分享,如何从性能、安全等维度优化直播服务器。

这一篇分享如何给直播服务器添加推流防盗链。

2 什么是防盗链

引用别人的总结:

网站资源都有域的概念,浏览器加载一个站点时,首先加载这个站点的首页,一般是index.html或者index.php等。页面加载,如果仅仅是加载一个index.html页面,那么该页面里面只有文本,最终浏览器只能呈现一个文本页面。丰富的多媒体信息无法在站点上面展现。

那么我们看到的各类元素丰富的网页是如何在浏览器端生成并呈现的?其实,index.html在被解析时,浏览器会识别页面源码中的img,script等标签,标签内部一般会有src属性,src属性一般是一个绝对的URL地址或者相对本域的地址。浏览器会识别各种情况,并最终得到该资源的唯一地址,加载该资源。具体的加载过程就是对该资源的URL发起一个获取数据的请求,也就是GET请求。各种丰富的资源组成整个页面,浏览器按照html语法指定的格式排列获取到各类资源,最终呈现一个完整的页面。因此一个网页是由很多次请求,获取众多资源形成的,整个浏览器在一次网页呈现中会有很多次GET请求获取各个标签下的src资源。

上图是一篇本站的博客网页呈现过程中的抓包截图。可以看到,大量的加载css、js和图片类资源的get请求。

观察其中的请求目的地址,可以发现有两类,一个是本站的43.242段的IP地址,这是本站的空间地址,即向本站自身请求资源,一般来说这个是必须的,访问资源由自身托管。另外一类是访问182的网段拉取数据。这类数据不是托管站内的,是在其他站点的。浏览器在页面呈现的过程,拉取非本站的资源,这就称“盗链”。

准确的说,只有某些时候,这种跨站访问资源,才被称为盗链

作者:elef
链接:https://www.jianshu.com/p/0a1338db6cab
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

3 为什么直播使用防盗链

直播是一个比较耗费服务器资源的功能。另外直播的观看用户也可控,可多可少,所以如果不对直播的源头进行控制的话,很容易引起一些不好的社会影响。直播分成推流和拉流,重点的防控在推流,如果不对推流进行控制的话,可能会有如下的影响:

  1. 直播推流地址泄漏,那么任何人都可以接入直播服务器,导致直播服务器资源应付不来而奔溃
  2. 直播推流地址泄漏,一些用意不良的人,会直播一些违法的内容,但是直播的载体是你的直播服务器,所以还会引起被动的违法

综上,需要对直播的推流进行防盗链措施。

4 http callback

http callback是srs提供一个当客户端和服务端进行交互满足某个事件的时候提供的一个回调通知功能。

在直播推流防盗链里头需要使用http callback来进行防盗检查。

Srs官网有提供详细的关于http callback的解释文档:https://gitee.com/ossrs/srs/wikis/v3_CN_HTTPCallback?sort_id=3957161

http callback的应用:

  • 事件:发生该事件时,回调指定的HTTP地址
  • HTTP地址:可以支持多个,以空格分隔,SRS会依次回调这些接口
  • 数据传输:SRS将数据POSTHTTP接口

5 直播防盗链实施

借助http callback来实现直播防盗链:

5.1 api准备

http callback的一个核心要素就是,我们要准备回调api,这个api由我们自己来定义。

笔者使用node-koa来创建一个web服务,提供这个回调api,大家可以使用其他的编程方式来提供api,比如java等。

Api必须满足如下几个条件:

  1. Api支持跨域访问
  2. Api支持post类型请求
  3. srs服务器能正常访问该url
  4. 调用该api之后,如果校验成功,http status必须返回200,同时输出0,否则视为校验失败

Koa的app.js的源码如下:

const koa = require('koa')
const koabodyparser = require('koa-bodyparser')
const app = new koa()
app.use(koabodyparser())
app.use(require('koa-cors')())
const router = require('koa-router')()
router.post('/', (ctx,next) => {
    console.log(JSON.stringify(ctx.request.body))
    ctx.body = 0
})

app.use(router.routes())
app.listen(3000)

5.2 配置api

Api准备好之后,需要将api配置到srs里头。配置的位置为当前的srs运行所以来的配置文件里头,如下:

vhost __defaultVhost__ {
   ...
    # http回调
    http_hooks{
        enabled       on;
        on_connect    http://192.168.7.100:9000/;
        on_close      http://192.168.7.100:9000/;
        on_publish    http://192.168.7.100:9000/;
        on_unpublish  http://192.168.7.100:9000/;
        on_play       http://192.168.7.100:9000/;
        on_stop       http://192.168.7.100:9000/;
        on_dvr        http://192.168.7.100:9000/;
        on_hls        http://192.168.7.100:9000/;
        on_hls_notify http://192.168.7.100:9000/;
    }
...
}

配置好之后,需要重启srs服务器。

5.2.1 api配置注意事项及问题

起初,作者在配置api的时候,因为把api的地址配置成:http://192.168.7.100:9000,导致回调不成功,一直出现400错误,但是这个地址我通过postman调用是没问题的。通过tcpdump抓包,也并没有得到进一步的错误的信息。后面软磨硬泡,硬磨出来的。原来问题是:api的地址后面上了一个/,如果通过ajax/axios或者postman等调试工具,缺少/是没有问题的,但是通过srs的配置文件配置api的url的话,少了/,就访问不了了。

5.3 防盗链

Srs的推流一般都是基于rtmp协议来进行的,这个时候可以在url里头添加用来防盗验证的参数,如token之类的。此时整个推流的url格式变了,例如:

rtmp://192.168.211.4:1935/live?token=121abc

 5.4 防盗参数获取

基于上述的配置重新推流,就可以在回调api指向的接口上获取到防盗链上的参数token,然后我们就可以基于token做一些验证了。

6 加入防盗链后的SRS的推流流程

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐