防盗链机制

article/2025/10/12 17:43:06

防盗链机制的几种实现


通常防盗链是为了防止图片,视频被盗用。下面简单介绍几种防盗链的机制:

 

1. 利用HTTP Referer字段

 

   HTTP请求中会包含来自哪个url的点击来源,通过这个referer字段可以检测是否别的网站发送的请求。

 

2.利用登录验证信息

 

   有些需要登录的可以通过登录的信息来检车。

 

3.使用cookie中的动态验证信息

 

   由服务器端产生动态cookie,每次请求检车cookie的动态信息跟服务器端保存的动态信息进行比对监测。

 

4.使用POST请求

 

   post请求能够增加盗链的难度。

 

5. 使用图形验证码

 

  图片验证码很常用的一种技术。

 

6. 使用动态密钥

 

  为资源url动态加密生成新的url,密钥可以临时生成,根据url的id文件名等信息进行自己的加密算法加密,访问的时候再用同样的加密算法进行验证

 

7. 在内容中插入数据

 

  可以在内容中加入哈希校验,在url中加入动态hash值



流媒体防盗链

功能介绍

     所谓安全防盗链,是一种加了防盗链签名的URL,经过签名的URL能够跟阿麦打流服务器的安全机制进行配合,可以将URL的使用权限定在您的APP上,恶意第三方拿到URL也不能使用和传播。

(1)推流 - 推流URL加防盗链的必要性极高,尤其是在直播码跟用户ID(或者DB ID)绑定的情况下,因为客户的直播码ID很容易被攻击者窃取,进而伪装客户自己进行抢占式推流,所以为推流URL增加防盗链签名,确保只有真正的客户主人自己才能在登录后拿到防盗链签名非常有必要。

(2)播放 - 播放URL加防盗链并不是100%必要的,只有在您的视频源是热门资源时(比如某个独家的赛事直播)才比较有价值,因为您要防止您的竞争对手拿到播放地址后在自家的APP里上架这个节目。播放地址防盗链引入后的副作用就是播放时可能需要申请防盗链签名,导致直播打开速度不稳定。

原理介绍

下图都是典型的安全防盗URL,您会发现这些地址都有一个共同的特点,就是在原来的推流或者播放地址后拼接txSecret和txTime参数。

AMAI打流全地址:rtmp://120.26.206.180/live/test?username=123456&password=123456
OBS打流:rtmp://120.26.206.180/live
KEY字符串:test?username=123456&password=123456
test?username=tinywan&password=123456&sign=8935737e61b6fdd586cdab3b15d79633
剔流地址:http://120.26.206.180/rtmp/controllortnoc/drop/client?app=live&name=tinywan

安全防护链的构建:

rtmp://120.26.206.180/live/100022_test111?tokenSecret=c7707f5550076bd1c731db0c94ed9366&tokenTime=579ACB15

txTime声明了该播放器的有效时间,比如5分钟,当这个地址在5分钟后被再次使用时,阿麦打流服务器将会判定其为过期地址而拒绝服务。

     但我们知道,简单声明txTime是没有意义的,因为任何攻击者都可以在一个窃取的URL后面拼接上一个声明100天过期的txTime,所以腾讯云需要有一种安全措施确保攻击者无法伪造txTime,这个安全措施就是txSecret。

txSecret是您的服务器计算出来的一个安全签名,计算公式是:txSecret = MD5( KEY + stream_id + txTime )

  • KEY
    需要您跟阿麦打流服务器在控制台上提交或者兑换的安全密钥,您应当确保除了您和阿麦打流服务器之外,外部无法获知,而且最好定期更换。

  • stream_id
    即直播码,当同时在线的主播比较多的时候,txTime 很容易碰撞,所以加入 stream_id 来防碰撞。

  • MD5
    最著名的单向不可逆HASH算法了,因为不可逆性,所以攻击者无法根据txSecret逆向计算出KEY,也就无法根据自己伪造的txTime计算出一个可以通过腾讯云验证的txSecret来。

合成方法

安全防盗链机制需要您的服务器和阿麦打流服务器协同才能完成,如下图:

【1】step1 - 交换秘钥
     首先,您需要在官网的控制台,协商一个加密密钥,这个加密密钥用于在您的服务器上生成防盗链签名,由于阿麦打流服务器跟您持有同样的密钥,所以您生成的防盗链签名,阿麦打流服务器是可以进行解密确认的。

加密秘钥分为推流防盗链KEY和播放防盗链KEY,前者用于生成推流防盗链URL,后者用于生成播放防盗链URL。目前在上可以自助配置推流防盗链KEY,如下图:

 

播放防盗链KEY由于同步周期长,不适合调试期频繁修改,如您需要配置请联系我们。

【2】step2 - 生成txTime
      签名中明文部分为txTime,含义是该链接的有效期,比如现在我当前的时间是2016-07-29 11:13:45,而且期望新生成的URL是在5分钟后即作废,那么txTime就可以设置为 2016-07-29 11:18:45。

      不过这么长一串时间字符串放在URL里显然不太“经济”,实际适用中,我们是把 2016-07-29 11:18:45 转换成Unix时间戳,也就是1469762325 (转换方式各种后台编程语言都由直接可用的时间函数来处理),然后转换成16进制,也就是 txTime=579ACB15。

复制代码
   /*** tokenTime* $currentTime :开始时间*/public function getTokenTime($currentTime , $expireTime){$tokenTime = dechex(strtotime($currentTime)+$expireTime);return strtoupper($tokenTime);}
复制代码

【3】 step3 - 生成txSecret
       txSecret的生成方法是 = MD5(KEY+ stream_id + txTime),这里的 KEY 就是您在Step1中跟腾讯云交换的加密密钥,stream_id在本例中为 8888_test001,txTime为刚才计算的579ACB15,MD5即标准的MD5单向不可逆哈希算法。

复制代码
    /*** tokenSecret* 顺序:MD5(KEY+ streamId + txTime)* @param int $streamId* @param string $currentTime* @param string $expireTime* @return string*/public function getTokenSecret($tokenTime,$streamId,$tokenTime){$KEY = '8935737e61b6fdd586cdab3b1';$tokenSecret = md5($KEY . $streamId . $tokenTime);return $tokenSecret;}
复制代码

 【4】step4 - 合成防盗链地址
现在我们有了推流(或者播放)URL,有了用来告知腾讯云该URL过期时间的txTime,有了只有腾讯云才能解密并且验证的txSecret,就可以拼合成一个防盗链的安全URL了。

 

复制代码
public function indexAction(){$this->tag->setTitle('详情');$request = $this->request;$domain = Domain::findFirst(array("id = :id:", "bind" => array("id" => 3)));if ($domain == false) {return $this->showError("未找到推流对象", array("返回域名管理" => "/domainaliyun","返回首页" => "/"));}$this->view->setVar("domain", $domain);if ($request->isPost()) {$original_url = $request->getPost('original_url');$deviceId = '1028';$currentTime = $request->getPost('startTime');$userId = $request->getPost('user_id');$expireTime = $request->getPost('expire');$streamId = $deviceId.$userId;$tokenTime = $this->getTokenTime($currentTime,$expireTime*60);$tokenSecret = $this->getTokenSecret($tokenTime,$streamId,$tokenTime);
       // 拼接url
$tokenUrl = $deviceId.'_test'.$userId."?tokenSecret=$tokenSecret&tokenTime=$tokenTime&userId=$userId";$redis = RedisInstance::getInstance();$redis->hMset('SIGNTOKEN:'.$userId, ['user_id' => $userId,'sign' => $tokenSecret,'expire' => $expireTime*60,'original_url' => $original_url,'status' => 'enable']);//这里保存过期时间,为了给客户短信通知,这个可以根据User_id去存储哦$redis->setex($userId,$expireTime*60,$tokenTime);$this->view->setVar("token_url", $tokenUrl);$this->view->setVar("tokenSecret", $tokenSecret);return TRUE;}}
复制代码

注意:Redis的键过期的时间设置应该是在用户已近开始打流的时候,也就是你用户的权限全部验证通过时候,设置改用户的userId为一个主键的过期时间,该时间也就是键过期的键值哦;注意在这里添加一句代码即可

复制代码
/*** 验证签名是否合适*/$sign = $redis->hGet('SIGNTOKEN:' . $userId, 'sign');$expire = $redis->hGet('SIGNTOKEN:' . $userId, 'expire');if ($tokenSecret != $sign) {echo "the sign errors";header('HTTP/1.0 404 Not Found');exit(1);} else {//这里保存过期时间,为了给客户短信通知,这个可以根据User_id去存储哦$redis->setex($userId,$expire,$tokenTime); //这里表示用户已近开始打流了,这时候计算打流时间就可以了echo "Username and Password OK";}return true;
复制代码


http://chatgpt.dhexx.cn/article/V3Y4Uauy.shtml

相关文章

网络中的防盗链是指什么?

什么是盗链? 比如,别人上传的东西,你直接拿了LINK去,贴到别的论坛或者网站,宣称"有好东西,快来下载",又或者告诉你的朋友"你要这个文件?俺有连接,快下",然后在那里接受别人的滔滔不绝的景仰之情。 “盗链” 的定义是: 此内容不在…

Nginx防盗链

Nginx防盗链的实现原理: 了解防盗链的原理之前,我们得先学习一个HTTP的头信息Referer,当浏览器向web服务器发送请求的时候,一般都会带上Referer,来告诉浏览器该网页是从哪个页面链接过来的。 后台服务器可以根据获取到的这个Referer信息来判…

Nginx-防盗链

目录 一、什么是盗链 如何区分哪些是不正常的用户? Referer理解 二、Nginx配置防盗链 三、使用 curl 测试防盗链 四、企业实战 1.设置返回错误页面 2.整合 rewrite 返回报错图片 一、什么是盗链 在实际生产过程中,我们线上的图片等静态资源&#…

Nginx:防盗链原理和配置

目录 一、防盗链概念 二、Nginx防盗链的具体实现 配置: 三、验证和验证时的问题 真正的验证: 没有none的验证 加上none参数的验证 让报错返回的是一张图片 注意事项: 一、防盗链概念 防盗链简单来说就是存在我们服务中的一些资源&#xff…

Java:eclipse下开发webservice教程

1 环境准备 下载wtp-all-in-one-sdk-R-1.5.4-win32,这个是eclipse的web开发插件 下载jakarta-tomcat-5.0.30 下载axis-src-1_4.zip 2 环境配置 配置tomcat关联到你的eclipse中 将axis-1_4\webapps\axis\WEB-INF\lib中的文件复制到$TOMCATHOME$\…

webservice 教程学习系列(九)——使用cxf框架开发webservice

首先下载两个包:apache-cxf-3.2.7.zip和apache-cxf-3.2.7-src.zip 解压两个包,进入apache-cxf-3.2.7的bin目录 可以看到wsdl2java.bat,这个相当于jdk自带的wsimport.exe的功能,可以将wsdl文件转换成java文件。 这里我的目录是&a…

WebService开发教程

一、webservice 开发 1.webservice介绍 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术。是:通过SOAP在Web上提供的软件服务,使用WSDL文件进行说明,…

MyEclipse开发WebService教程

创建一个 webService 工程。 2. 创建一个普通 Java 类 view plain copy to clipboard package com.hmw.jaxws; /** * 提供 WebService 服务的测试类<br> * <b>注意&#xff1a;</b>该类必须有一个无参构造方法&#xff0c;否则无法使用 MyEclipse 的向导为此…

WebService培训教程详解

开发webservice 1. 概述 开发手段&#xff1a;使用JDK开发(1.6及以上版本)使用CXF框架开发(工作中)组成&#xff1a;服务器端客户端 2. 使用JDK开发WebService 1).开发服务器端 Web Service编码&#xff1a;WebService( SEI和SEI的实现类)WebMethod(SEI中的所有方法)发布W…

SoapUI测试webservice接口

方法1、导入wsdl文件 输入参数&#xff0c;点击运行&#xff0c;看到响应结果 方法2、输入wsdl地址 项目名随便起一个&#xff0c;Initial WSDL直接输入wsdl地址&#xff0c;确定即可。

孔浩老师 java 微信_孔浩老师JAVA WebService教程

课程目录&#xff1a;01_webservice快速实例 02_wsimport的使用 03_wsdl和soap讲解(介入了tcpmon工具) 04_SOA的分析(纯属扯淡) 05_dtd讲解 06_schema的命名空间 07_schema的元素和属性的定义 08_schema的语法和建议的编写方式 09_使用jaxb完成对象和xml的转换 10_Stax的基本操…

.Net WebService简单学习

一、什么是WebService Web Service是一个使用开放的XML&#xff08;标准通用标记语言下的一个子集&#xff09;标准来描述、发布、发现、协调和配置这些应用程序&#xff0c;用于开发分布式的交互操作的应用程序。 Web Service技术&#xff0c; 能使得运行在不同机器上的不同应…

java webservice 入门教程_WebService入门实例教程

什么是WebService 通过使用WebService&#xff0c;您的应用程序可以向全世界发布信息&#xff0c;或提供某项功能&#xff0c;它是基于Web的服务&#xff0c;通过Web进行发布、查找和使用。 WebService脚本平台需支持XMLHTTP。 HTTP协议是最常用的因特网协议。 XML提供了一种可…

idea使用xfire方式发布webservice教程

近日在熟悉webservice发布的过程&#xff0c;此处主要讲解xfire方式。 1.使用idea新建一个web项目 步骤1&#xff1a; 按照图中的指定序号建立对应的web项目即可。 步骤2&#xff1a; 填写组织ID和具体项目id&#xff0c;点击进行“下一步”即可。 步骤3&#xff1a; 设置相…

java发布webService服务教程

发布webService服务并使用soap UI测试 发布简单的webService服务同时发布多个webService接口使用SoapUI测试webService接口下载SoapUI并安装打开WSDL文件测试文件上传 示例源码 发布简单的webService服务 新建一个Maven项目pom引入 webService需要的依赖 <dependency>&…

WebService 教程(包含项目实践)

情景引入&#xff1a; 时间&#xff1a;早晨 8 : 00 am 小白&#xff1a;起床起床&#xff0c;&#xff0c;&#xff0c;公司又来需求了&#xff0c;你还在睡觉&#xff0c;快点起来~&#xff01; 我&#xff1a;大惊小怪&#xff0c;又怎么了呢&#xff1f;小白&#xff0c…

最详细的idea创建webservice教程

最详细的idea创建webservice教程 创建服务端 File->New Project 点击next&#xff0c;会自动生成demo将要发布的类加上WebService&#xff0c;方法加上WebMethod&#xff0c;设置服务发布address WebService() public class HelloWorld {WebMethodpublic String sayHello…

WebService简单入门

1. JAX-WS发布WebService 创建web工程 创建simple包&#xff0c;和server、client两个子包。正常情况下server和client应该是两个项目&#xff0c;这里我们只是演示效果&#xff0c;所以简化写到一个项目中&#xff1a; 1.1 创建服务类Server package simple.server;import ja…

WebService教程实例

一、准备工作 1、Myeclipse 2014 2、jdk8.0 二、创建服务端 1、创建【Web Service Project】&#xff0c;命名为【TheService】。 2、创建【Class】类&#xff0c;命名为【ServiceHello】&#xff0c;位于【com.hyan.service】包下。 3、编写供客户端调用的方法&#xff0c;即编…

Java小白翻身 - webservice教程2

来一个HelloWorld&#xff0c;SpringBoot发布WebService可简单啦。 1、搭建项目2、配置pom.xml3、建services服务包4、登陆接口类5、登陆接口实现类6、创建CXF配置类7、Parameter 0 of method errorPageCustomizer in ErrorMvcAutoConfiguration 异常解决8、访问webservice9、…