为什么80%的码农都做不了架构师?>>>
有时候站点有bug,很容易会被人修改,添加其他乱七八糟的东西,针对这类问题,常见的做法:1、修改升级程序漏洞。2、用WAF主动防御(用第三方免费cdn,也提供这类防御)。
本文我们介绍第三种方法(如果网站固定文件不变的情况下)网站部署好后,通过对站点所有文件的计算MD5值,并保存在一个文件中。然后以后可以手动或者crontab,监控程序等定期对保存文件中的文件生成md5值和已有的md5值对比,如果发现值对不上,则说明文件被篡改了。
use strict;
use warnings;
use Digest::MD5 qw(md5_hex);my $dir=shift;
# 此处默认为检查md5值。
md5check($dir);
# 如果需要开始生成web目录的md5值,注释掉上面一句,把下面一句启用
#md5init($dir);
sub md5_sum {my ($file_name,$mode)=@_;my ($FD,$ctx, $md5);open ($FD,$file_name) or die "Can't open /'$file_name/': $!";$ctx = Digest::MD5->new;binmode($FD) if $mode;$ctx->addfile($FD) || die "$!\n";$md5 = $ctx->hexdigest;close $FD;return $md5;
}sub md5check {
my $file=shift;
open(my $fd, '<',$file) or die "$file: $!\n";
print $file;
while (<$fd>){my ($name, $sum) = split /\s+/;if ($sum eq md5_sum($name,1)){print "$name OK\n";}else{print "$name FAILED\n";}
}close $fd;}
# 遍历目录计算md5值
sub md5init {my $fd=shift;my $md5value;if ( -f $fd ){if ( -T $fd ) {#print "按照文本模式进行计算MD5!\n";$md5value =md5_sum($fd,0);print "$fd\t$md5value\n";}elsif( -B $fd ){#print "二进制文件用binmod计算MD5!\n";$md5value =md5_sum($fd,1);print "$fd\t$md5value\n";}else{#print "其他文件,按照bimmod计算!\n";$md5value = md5_sum($fd,1);print "$fd\t$md5value\n";}}elsif( -d $fd ){my $file_md5;# print "开始验证目录下所有文件:\n";opendir (my $DH,$fd) or die "Can't open dir $fd: $!";for(readdir $DH ){my $file=$fd.'/'.$_;# 上级目录..,本目录. 以及连接文件跳过next if ($file =~ m{/.$} || $file =~ m{/..$} || -l $file );md5chek($file);}closedir $DH;}}
以上程序保存成文件,比如filemd5check.pl
注意以上代码,笔者已经写成模块MD5sum,可以通过oschina的git库:
http://git.oschina.net/ijz/MD5Check
同时可以通过perl cpan库安装文件进行安装。cpanm MD5Check
一、生成web的md5验证文件:
注释掉
#md5check($dir);
md5init($dir);
然后执行 web目录 > webmd5-20160920
web目录换成自己实际的web目录 webmd5-20160920 为保存计算结果的文件,可以自定义
二、检查时候,用默认文件
perl filemd5check.pl webmd5-20160920