有時候站點有bug,很容易會被人修改,添加其餘亂七八糟的東西,針對這類問題,常見的作法:一、修改升級程序漏洞。二、用WAF主動防護(用第三方免費cdn,也提供這類防護)。git
本文咱們介紹第三種方法(若是網站固定文件不變的狀況下)網站部署好後,經過對站點全部文件的計算MD5值,並保存在一個文件中。而後之後能夠手動或者crontab,監控程序等按期對保存文件中的文件生成md5值和已有的md5值對比,若是發現值對不上,則說明文件被篡改了。web
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庫:.net
http://git.oschina.net/ijz/MD5Checkcode
同時能夠經過perl cpan庫安裝文件進行安裝。cpanm MD5Checkcdn
1、生成web的md5驗證文件:crontab
註釋掉md5
#md5check($dir);部署
md5init($dir);it
而後執行 web目錄 > webmd5-20160920
web目錄換成本身實際的web目錄 webmd5-20160920 爲保存計算結果的文件,能夠自定義
2、檢查時候,用默認文件
perl filemd5check.pl webmd5-20160920