有些朋友的帝国cms网站上会有视频点播功能,但视频地址如何防盗一直是个问题,例如页面上是引用了mp4地址,查看源码即可看到,这样很容易被人盗链。
解决思路:
1、删掉环境中mp4文件的mine类型设定,这样便导致直接访问mp4文件无法访问,因为没有相应的头部声明。
2、通过地址重写功能,将被访问的mp4文件重写到一个验证文件上,mp4地址带有秘钥。
3、验证文件上同样计算秘钥并进行比对,判断时间和其他参数,通过则发送mp4文件头并输出地址。
这样既解决了地址盗链的问题,又无需在地址加密上下功夫,因为无论怎么加密,其实都能够解密出来,也是徒劳。
解决方法:
一、修改mine,删掉mp4的文件类型
以我们现在的测试环境为例,apache是修改 /conf/mime.types 文件
删掉后需要重启apache环境。
二、修改调用播放地址的位置,输出我们要增加的参数用于验证访问权限。
这里我们需要两个参数,分别为c和t,分别对应“生成的秘钥”和“当前时间戳”
秘钥逻辑为:
code=md5(当前时间戳+用户id+随机符)
我们输出播放地址出的页面做一下处理:
折叠PHP 代码
- /*
 - 加密方式:
 - code=md5(当前时间戳+用户id+随机符,TRUE)
 - */
 - //随机码
 - $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]

