资源防盗链(双重)

比如一个音乐网站,有些人会耍些小聪明,如下图所示通过审核元素的方式获取音频链接。
20190329125446.png
理论上只要是个用户都可以做到,只要有个电脑和浏览器。

那么如何做到,用浏览器单独访问时不被解析呢?(如下图所示)
20190329125008.png

又如何做到,防止在其他网页的播放器上悄悄引用自己服务器的地址进行流量盗链呢?(如下图所示)
20190329125102.png

以上示范通过第三方的网站播放器悄悄引用自己服务器的资源地址其实是有一部分效果的,那就是会播报14秒的语音提醒用户进入了盗版网页,该网页试图窃取资源,并给出了正确的官网地址。因为14秒和第一张截图的“未白镇” 1:59 秒 有很大的不同了,细心的你可以看出区别。

那么实际上,上面的防盗链已实行了双防盗策略,对于想通过浏览器直接访问的人来说,会显示图片防盗链。对于想通过第三方网站播放器引用资源的人来说,会加载14秒的语音防盗播报。

毫无疑问,这个时候可以牺牲点服务器性能,采用后端控制资源访问,隐藏真实地址。然而做防盗链有个非常重要要解决的问题就是,采用后端控制资源访问,那么header头信息将不再由服务器自动处理,而是交给后端进行处理。很明显会出现一系列的大问题。具体请看服务器缓存篇(用于解决动态资源访问导致的缓存失效问题):
https://www.cwmoo.cn/blog/109/

【实现思路】
一般的防盗链都可以通过 session 解决第一步问题,就是需要先访问某个页面,这个session会被激活,才可以访问调取资源的接口。session的位置一般在开头,那么,图片形式展示的防盗链其实就可以通过这种方式,进行判断。具体就是输出一个img标签罢了。

那么实际上一般情况设置后,就不可能会出现二般情况了,所以,只要没访问主站,还真就无法调取任何资源。但是呢,这么想往往是异想天开,忽略了某些因素。
比如用户本身就是主站的粉丝呢?假如有一个竞争对手他也盗用自己站点的资源。那么,这个时候用户可能会先开主站激活session,session已激活,再去别的网站听,那岂不是就没有资源防盗了呢?(谁特么会这么干?谁能保证哪个用户在访问别的网站之前必须得先访问自己的主站?那盗资源的网站不是就露馅了么?)
只能说问这个问题的还年轻,iframe了解不?我哪怕不设置宽高不让iframe显示出来,只需要iframe有设置地址,用户访问时自然就会访问iframe中的网页,自然就激活了主站session,那盗你不是很轻松?

那么二般思路就是在session的后面,当程序将资源的地址组装完毕且路径正确之后,对上一级页面进行判断。是否是通过别的页面重定向到这个资源,如果不是,则直接输出图片展示的防盗链形式提醒,因为这个可以确定用户是通过接口工具或者浏览器直接访问。那如果是别的页面重定向的呢?

再进行判断,这些判断中用户可以获取上一级页面的地址是否是我们自己的主站地址,如果不是,自然就是第三方的网站,那这时就可以将14秒的音频送给他。所以可以通过是否重定向以及重定向之前的地址是否是主站地址进行判断。有人说可以更改header头信息啊,对啊,但是这个针对用户来讲已经足够了。如果再往上,就要有接口工具修改header信息了?哪个用户会访问一个资源这么做?只有有意盗取资源的人会这么做,然并卵。因为这类人只能在自己的电脑上得到测试结果,那也无法改变其他用户的访问意向。