帝国cms会员点播视频时的页面防盗链鉴权验证思路

帝国cms网站上会有视频点播功能,但视频地址如何防盗一直是个问题,例如页面上是引用了mp4地址,查看源码即可看到,这样很容易被人盗链。

解决思路:

1、删掉环境中mp4文件的mine类型设定,这样便导致直接访问mp4文件无法访问,因为没有相应的头部声明。

2、通过地址重写功能,将被访问的mp4文件重写到一个验证文件上,mp4地址带有秘钥。

3、验证文件上同样计算秘钥并进行比对,判断时间和其他参数,通过则发送mp4文件头并输出地址。

这样既解决了地址盗链的问题,又无需在地址加密上下功夫,因为无论怎么加密,其实都能够解密出来,也是徒劳。

解决方法:

一、修改mine,删掉mp4的文件类型

以我们现在的测试环境为例,apache是修改 /conf/mime.types 文件

删掉后需要重启apache环境。

二、修改调用播放地址的位置,输出我们要增加的参数用于验证访问权限。

这里我们需要两个参数,分别为c和t,分别对应“生成的秘钥”和“当前时间戳”

秘钥逻辑为:

code=md5(当前时间戳+用户id+随机符)

我们输出播放地址出的页面做一下处理:

折叠PHP 代码
  1. /*
  2. 加密方式:
  3. code=md5(当前时间戳+用户id+随机符,TRUE)
  4. */
  5. //随机码
  6. $tsalt='cmsdx';
  7. $ttime=time();
  8. $tuserid=getcvar('mluserid');
  9. $tstr=$ttime.$tuserid.$tsalt;
  10. $tcode=md5($tstr);
  11. echo $trueurl.'?c='.$tcode.'&t='.$ttime;

三、编写验证文件,方式如下,生成秘钥并进行比对。

折叠XML/HTML 代码
  1. <?php
  2. require('e/class/connect.php');        //引入数据库配置文件和公共函数文件
  3. require('e/class/db_sql.php');        //引入数据库操作文件
  4. $link=db_connect();                //连接MYSQL
  5. $empire=new mysqlquery();        //声明数据库操作类
  6. /*
  7. 加密方式:
  8. code=md5(当前时间戳+用户id+随机符)
  9. */
  10. //随机码
  11. $salt='cmsdx';
  12. //获取时间戳
  13. $time=(int)$_GET['t'];
  14. if(!$time){
  15.     exit();
  16. }
  17. $yztime=$time+1800;
  18. if($yztime<time()){
  19.     exit();
  20. }
  21. //用户id
  22. $userid=getcvar('mluserid');
  23. if(!$userid){
  24.     exit();
  25. }
  26. $str=$time.$userid.$salt;
  27. //生成秘钥
  28. $code=md5($str);
  29. //获取地址中的秘钥
  30. $ycode=$_GET['c'];
  31. if(!$ycode){
  32.     exit();
  33. }
  34. if($ycode==$code){
  35.     $url=$_GET['url'];
  36.     if(!$url){
  37.         exit();
  38.     }
  39.     header('Content-type: video/mpeg4');
  40.     header('Content-Disposition: attachment; filename="video.mp4"');//下载后的文件名
  41.     readfile($url);//文件实际地址
  42. }
  43. else{
  44.     exit();
  45. }
  46. db_close();                        //关闭MYSQL链接
  47. $empire=null;                        //注消操作类变量
  48. ?>

四、编写伪静态规则,进行地址重写,这时要注意将参数也转过去,下面为apache的规则。

RewriteRule ^(.*).mp4$   verify.php?url=$1.mp4 [QSA]

THE END