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

[经验分享] ApacheHttpServer+mod_perl实现防盗链

[复制链接]

尚未签到

发表于 2017-5-18 09:52:01 | 显示全部楼层 |阅读模式
  最近上司部署了个研究防盗链的任务.经过多方搜索找到使用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脚本,收获蛮大的.

运维网声明 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-378668-1-1.html 上篇帖子: [Perl文]IO::Socket简介 下篇帖子: Perl 作为命令行实用程序
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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