有时候站点有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, '
print $file;
while (){
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