ApacheHttpServer+mod_perl实现防盗链
最近上司部署了个研究防盗链的任务.经过多方搜索找到使用mod_perl实现防盗链的文章,但是整个安装配置过程阻碍甚多.故作此文以为梳理. ? 首先是依赖模块的安装. 1.安装ApacheHttpServer2.2(这是废话) 2.安装Perl5.8.*.或Perl5.12.*
3.使用PerlPPM安装mod_perl,命令如下 对于Perl5.8 ppm install?http://theoryx5.uwinnipeg.ca/ppms/mod_perl.ppd 对于Per5.12 ppm install?http://cpan.uwinnipeg.ca/PPMPackages/12xx/mod_perl.ppd ?? 还要安装libapreq2 对于Perl5.8 ppm install?http://theoryx5.uwinnipeg.ca/ppms/libapreq2.ppd 对于Perl5.12 ?暂时还是没找到使用PPM的安装仓库,所以还是建议使用Perl5.8吧. ? 两个模块的安装过程中会提示指定ApacheHttpServer的安装目录,依实填写即可. ? 4.配置httpd.conf(都知道这个是ApahceHttpServer的配置文件吧?) 增加如下片段(其中的PERL_HOME,APACHE_HOME在使用时要替换为真实的文件系统路径) LoadFile "%PERL_HOME%/bin/perl58.dll" LoadModule perl_module modules/mod_perl.so LoadFile "%APACHE_HOME%/bin/libapreq2.dll" LoadModule apreq_module modules/mod_apreq2.so ? PerlPostConfigRequire %APACHE_HOME%/modperl/startup.pl <Location / >?#这里对整个域都要求验证,可以自定义 SetHandler modperl?#设置处理器 PerlAccessHandler KeyAccess?#使用的perl编写的处理器 PerlSetVar key 123?#下面的脚本使用这里的key值做密钥进行加密验证 </Location> 5.编写Perl脚本 第4步中有一个modperl目录,在这个目录中增加两个文件 startup.pl
use strict; use lib qw(d:/ProgramFiles/ApacheSoftwareFoundation/Apache2.2/modperl); # 把这个路径加入到perl lib路径 #d:/ProgramFiles/ApacheSoftwareFoundation/Apache2.2 这部分替换成实际的目录 use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::Connection (); use Apache2::RequestUtil (); use Apache2::ServerUtil (); use Apache2::Log (); use Apache2::Request (); 1; ? KeyAccess.pm ? ? package KeyAccess; use strict; use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::Connection (); use Apache2::RequestUtil (); use Apache2::ServerUtil (); use Apache2::Log (); use Apache2::Const -compile => qw(OK FORBIDDEN); use Apache2::Request (); use Digest::MD5 qw(md5 md5_hex md5_base64); sub handler { my $r = shift; my $req = Apache2::Request->new($r); my $ip = $r->connection->remote_ip; my $k = $req->param('key') || ''; # 判断访问时是否带key参数 my $key = $r->dir_config('key') || '123'; # 加载httpd.conf配置中的key值 my $md5value=md5_hex($key.$ip); #使用MD5加密验证 if ($md5value eq $k) { # 相等可以正常访问 return Apache2::Const::OK; } else { # 否则显示拒绝访问 my $s = Apache2::ServerUtil->server; $s->log_error("[$ip--------forbidden.]"); return Apache2::Const::FORBIDDEN; } } 1;? 6.启动服务器 7.尝试访问http://host:port/index.html,会返回一个forbidden响应. 只有使用http://host:port/index.html?key=value才能访问,这里的value为httpd.conf中设置的key+用户ip的MD5值. ? 总结: 自己写的应用需要按照这个约定返回给用户带有正确key的链接地址,用户点击之后正常访问资源.而且该链接只针对一个ip的用户,copy给其它ip的用户是没用的.这样就达到了防盗链的目的. ? Perl脚本的验证部分也可以写别的东西做验证,比如验证加密的时间串,实现自定义过期时间的链接. ? 本文只是照本宣科,并未追根溯源,mod_perl可以访问很多Apache的api,可以深入研究. 此外我也不知道为什么要安装libapreq2,但目的达成,暂时足矣. ? 整个过程,还稍稍学习了一下Perl脚本,收获蛮大的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |