有时候站点,有bug,很容易会被人修改,添加其他乱七八糟的东西,针对这类问题,常见的做法:1、修改升级程序漏洞。2、用WAF主动防御(用第三方免费cdn,也提供这类防御)。
这儿介绍第三种方法(如果网站固定文件不变的情况下)
网站部署好后,通过对站点所有文件的计算MD5值,并保存在一个文件中。然后以后可以手动或者crontab,监控程序等定期对保存文件中的文件生成md5值和已有的md5值对比,如果发现值对不上,则说明文件被篡改了。
程序perl:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
#!/usr/bin/perl 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
一、生成web的md5文件是时候:
注释掉
1 |
#md5check($dir); |
1 |
md5init($dir); |
然后执行 web目录 > webmd5-20160920
web目录换成自己实际的web目录 webmd5-20160920 为保存计算结果的文件,可以自定义
二、检查时候,用默认文件
perl filemd5check.pl webmd5-20160920
已经发布为模块形式以便于调用