设为首页 收藏本站
查看: 942|回复: 0

[经验分享] 【Anychat音视频开发】apache防盗链之mod_perl

[复制链接]

尚未签到

发表于 2018-8-31 09:02:21 | 显示全部楼层 |阅读模式
  客户需求如下:
  在web请求视频时,按算法生成密文和明文串,然后依规则组成最终的url请求;
  算法规则——用如下三个关键词生成MD5密文:
  1、自定义密钥:abcde.;
  2、视频文件真实路径,即/path/to/file.rmvb;
  3、请求时间,以当前UNIX时间换算为十六进制字符串,并作为明文;
  最终url格式是http://www.test.com/path/to/file.rmvb?key=1234567890abcdefghijklmnopqrstuy&t=1234abcd这样。
  要求失效时间为8小时。
  这个需求和之前一次相当类似,不过上回是squid,这次是apache。同样采用perl脚本进行防盗链设置,apache需要使用mod_perl模块。
  首先安装perl模块:
  wget http://perl.apache.org/dist/mod_perl-2.0-current.tar.gz
  tar zxvf mod_perl-2.0-current.tar.gz
  cd mod_perl-2.0-current.tar.gz
  perl Makefile.PL MP_APXS=/home/apache2/bin/apxs
  make && make install
  echo "LoadModule perl_module modules/mod_perl.so" >> /home/apache2/conf/httpd.conf
  perl -MCPAN -e shell
  >install Apache2::Request
  >look Apache2::Request
  rm -f configure
  rm -f apreq2-config
  ./buildconf
  perl Makefile.PL
  make && make install
  exit
  (因为64位系统的libexpat.so有问题,编译libapreq2会出问题,只好如此强制安装)
  echo "LoadModule apreq_module modules/mod_apreq2.so" >> /home/apache2/conf/httpd.conf
  因为libapreq2.so安装在/home/apache2/lib/下了,所以需要echo "/home/apache2/lib">/etc/lo.so.conf.d/apache.conf,然后ldconfig。
  修改httpd.conf,加入如下设置:
  PerlPostConfigRequire /home/apache2/perl/start.pl
  
  SetHandler modperl
  PerlAccessHandler DLAuth
  PerlSetVar ShareKey abcde.
  
  然后mkdir /home/apache2/perl/,在其中创建start.pl和DLAuth.pm两个文件。start.pl文件内容如下:
  use strict;
  use lib qw(/home/apache2/perl);
  use Apache2::RequestIO ();
  use Apache2::RequestRec ();
  use Apache2::Connection ();
  use Apache2::RequestUtil ();
  use Apache2::ServerUtil ();
  use Apache2::Log ();
  use Apache2::Request ();
  1;
  DLAuth.pm文件内容如下:
  package DLAuth;
  use strict;
  use warnings;
  use Socket qw(inet_aton);
  use POSIX qw(difftime strftime);
  use Digest::MD5 qw(md5_hex);
  use Apache2::RequestIO ();
  use Apache2::RequestRec ();
  use Apache2::Connection ();
  use Apache2::RequestUtil ();
  use Apache2::ServerUtil ();
  use Apache2::Log ();
  use Apache2::Request ();
  use Apache2::Const -compile => qw(OK FORBIDDEN);
  sub handler {
     my $r = shift;
     my $s = Apache2::ServerUtil->server;
     my $shareKey = $r->dir_config('ShareKey') || '';
     my $uri = $r->uri() || '';
     my $args = $r->args() || '';
     my $expire = 8 * 3600;
     if ($args =~ m#^key=(\w{32})\&t=(\w{8})$#i){
     my ($key, $date) = ($1, $2);
     my $str = md5_hex($shareKey . $uri . $date)
     my $reqtime = hex($date);
     my $now = time;
     if ( $now - $reqtime < $expire){
         if ($str eq $key) {
             return Apache2::Const::OK;
         } else {
                 $s->log_error(&quot;[$uri FORBIDDEN] Auth failed&quot;);
             return Apache2::Const::FORBIDDEN;
         }
     }
     }
     $s->log_error(&quot;[$uri FORBIDDEN] Auth failed&quot;);
     return Apache2::Const::FORBIDDEN;
  }
  1;
  就可以了。
  apachectl restart。测试一下,先用perl自己生成一个测试链接:
  #!/usr/bin/perl -w
  use Digest::MD5 qw(md5_hex);
  my $key = &quot;bestv.&quot;;
  $path = shift(@ARGV);
  my $date = sprintf(&quot;%x&quot;,time);
  $result = md5_hex($key . $path . $date);
  my $uri = &quot;http://127.0.0.1$path\?key=$result\&t=$date&quot;;
  print $uri;
  运行./url.pl /smg/abc.rmvb生成http://127.0.0.1/smg/abc.rmvb?key=4fb6b4e6a0ec484aea98fa727fc7149d&t=4bc7dd5a,然后wget -S -O /dev/null &quot;http://127.0.0.1/smg/abc.rmvb?key=4fb6b4e6a0ec484aea98fa727fc7149d&t=4bc7dd5a&quot;,返回200 OK;任意修改t为12345678,再wget,返回403 Forbidden。error_log显示如下:
  [Fri Apr 16 11:47:06 2010] [error] [/smg/abc.rmvbkey=4fb6b4e6a0ec484aea98fa727fc7149d&t=12345678 FORBIDDEN] Auth failed
  Anychat专业即时通讯方案,专注六年的研发。能够给你提供最高清实时的音视频即时通讯。
  如有需要下载体验可以访问http://www.bairuitech.com/
  详细了解可以致电020-38109065/ 020-38103410或者加Q1816573263。


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-559167-1-1.html 上篇帖子: 一个用于比较两个文件行中不同的Perl脚本 下篇帖子: perl 判断ip是否在某个子网
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表