后台文件校验工具原理

最近很多站点打了0817的补丁,出现页面500错误,或这漏出源代码。虽然不都是文件不完整造成的,但也有一部分是这样的。
有些站点修改过文件,或ftp工具上传过程中文件上传的不完整,就出现了这样那样的问题,找不到根源,还以为设置的问题。
如果站点出现所谓的乱码即漏出源码,或者不明原因空白了,第一个应该想到的就是文件校验,这个功能我发现很多人不用。如果站长自己不懂代码,更没改过源码,如果出现上述问题,那就得必须校验文件,因为你没动过,理论上是源文件完整的,如果校验出问题,哪些文件修改过,或丢失,传完整的文件覆盖都能解决问题。
我们看看文件校验工具如何工作的:
通过后台链接(admin.php?action=checktools&operation=filecheck)知道,调用source目录下admincp目录下的amdincp_checktools.php文件。

if(!$discuzfiles = @file('./source/admincp/discuzfiles.md5')) {
                        cpmsg('filecheck_nofound_md5file', '', 'error');
}

这个discuzfiles.md5文件,就是源文件打包时,自带的。是对整个文件进行md5加密后的内容。内容大概类似于:

0f6c9556a3227a6cad2a1a73b35bff6d *./admin.php
ac32c9e1f5286d86a4fe2ec70d4c42bb *./api
df03ab804e12efa0455a565a6797f3d4 *api/connect/connect.php
6b5b6ea7d9737c181088d68a6171a960 *api/connect/like.php

…… ……
前面的字符串就是对后面的文件md5后得出的,包括创建修改时间,文件大小,等等信息。
这里判断一下是否能读到这个文件,读不到,报错,缺少这个文件。

checkfiles('./', '', 0);
                checkfiles('config/', '', 1, 'config_global.php,config_ucenter.php');
                checkfiles('data/', '\.xml', 0);
                checkfiles('data/avatar/', '\.htm', 0);
                checkfiles('data/cache/', '\.htm', 0);
                checkfiles('data/ipdata/', '\.htm|\.dat', 0);
                checkfiles('data/template/', '\.htm', 0);
                checkfiles('data/threadcache/', '\.htm', 0);
                checkfiles('template/', '');
                checkfiles('api/', '');
                checkfiles('source/', '', 1, 'discuzfiles.md5');
                checkfiles('static/', '');
                checkfiles('archiver/', '');
                checkfiles('uc_client/', '\.php|\.htm', 0);

下面的这些步骤,就是循环遍历目录及问价,然后也同样是进行md5操作,目的是和初始的md5串对比。

foreach($discuzfiles as $line) {
                        $file = trim(substr($line, 34));
                        $md5datanew[$file] = substr($line, 0, 32);
                        if($md5datanew[$file] != $md5data[$file]) {
                                $modifylist[$file] = $md5data[$file];
                        }
                        $md5datanew[$file] = $md5data[$file];
                }

接下来就是拿初始的和后来md5的赋值处理,最后得出的结果既包含了修改的,又包含丢失的,改动过的,以备接着和新md5的数据尽心比对。

$addlist = @array_merge(@array_diff_assoc($md5data, $md5datanew), $cachelist[2]);
                $dellist = @array_diff_assoc($md5datanew, $md5data);
                $modifylist = @array_merge(@array_diff_assoc($modifylist, $dellist), $cachelist[1]);
                $showlist = @array_merge($md5data, $md5datanew, $cachelist[0]);

以上四句,分别为多出来的文件;丢失的文件;修改过的及未知的等等。都是通过array_diff_assoc函数,把初始的md5数据和新md5数据比对,得出结果。剩下的代码就是对一些要显示的变量进行赋值。
之前 写的一个可以独立运行的文件校验小脚本,就是通过这个原理来写的。

Tags: , ,

发表回复