有些朋友的帝国cms网站上会有视频点播功能,但视频地址如何防盗一直是个问题,例如页面上是引用了mp4地址,查看源码即可看到,这样很容易被人盗链。
解决思路:
1、删掉环境中mp4文件的mine类型设定,这样便导致直接访问mp4文件无法访问,因为没有相应的头部声明。
2、通过地址重写功能,将被访问的mp4文件重写到一个验证文件上,mp4地址带有秘钥。
3、验证文件上同样计算秘钥并进行比对,判断时间和其他参数,通过则发送mp4文件头并输出地址。
这样既解决了地址盗链的问题,又无需在地址加密上下功夫,因为无论怎么加密,其实都能够解密出来,也是徒劳。
解决方法:
一、修改mine,删掉mp4的文件类型
以我们现在的测试环境为例,apache是修改 /conf/mime.types 文件
删掉后需要重启apache环境。
二、修改调用播放地址的位置,输出我们要增加的参数用于验证访问权限。
这里我们需要两个参数,分别为c和t,分别对应“生成的秘钥”和“当前时间戳”
秘钥逻辑为:
code=md5(当前时间戳+用户id+随机符)
我们输出播放地址出的页面做一下处理:
折叠展开PHP 代码
-
-
-
-
-
- $tsalt='cmsdx';
- $ttime=time();
- $tuserid=getcvar('mluserid');
- $tstr=$ttime.$tuserid.$tsalt;
- $tcode=md5($tstr);
- echo $trueurl.'?c='.$tcode.'&t='.$ttime;
三、编写验证文件,方式如下,生成秘钥并进行比对。
折叠展开XML/HTML 代码
- <?php
- require('e/class/connect.php'); //引入数据库配置文件和公共函数文件
- require('e/class/db_sql.php'); //引入数据库操作文件
- $link=db_connect(); //连接MYSQL
- $empire=new mysqlquery(); //声明数据库操作类
- /*
- 加密方式:
- code=md5(当前时间戳+用户id+随机符)
- */
- //随机码
- $salt='cmsdx';
- //获取时间戳
- $time=(int)$_GET['t'];
- if(!$time){
- exit();
- }
- $yztime=$time+1800;
- if($yztime<time()){
- exit();
- }
- //用户id
- $userid=getcvar('mluserid');
- if(!$userid){
- exit();
- }
- $str=$time.$userid.$salt;
- //生成秘钥
- $code=md5($str);
- //获取地址中的秘钥
- $ycode=$_GET['c'];
- if(!$ycode){
- exit();
- }
- if($ycode==$code){
- $url=$_GET['url'];
- if(!$url){
- exit();
- }
- header('Content-type: video/mpeg4');
- header('Content-Disposition: attachment; filename="video.mp4"');//下载后的文件名
- readfile($url);//文件实际地址
- }
- else{
- exit();
- }
-
- db_close(); //关闭MYSQL链接
- $empire=null; //注消操作类变量
- ?>
四、编写伪静态规则,进行地址重写,这时要注意将参数也转过去,下面为apache的规则。
RewriteRule ^(.*).mp4$ verify.php?url=$1.mp4 [QSA]