Discuz!官方免费开源建站系统

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

后台文件校验工具原理

[复制链接]
vinsonwang 发表于 2011-8-31 18:03:22 | 显示全部楼层 |阅读模式
本帖最后由 vinsonwang 于 2011-8-31 20:28 编辑

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

  1. if(!$discuzfiles = @file('./source/admincp/discuzfiles.md5')) {
  2.                         cpmsg('filecheck_nofound_md5file', '', 'error');
  3. }
复制代码
这个discuzfiles.md5文件,就是源文件打包时,自带的。是对整个文件进行md5加密后的内容。内容大概类似于:

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

…… ……
前面的字符串就是对后面的文件md5后得出的,包括创建修改时间,文件大小,等等信息。
这里判断一下是否能读到这个文件,读不到,报错,缺少这个文件。
  1. checkfiles('./', '', 0);
  2.                 checkfiles('config/', '', 1, 'config_global.php,config_ucenter.php');
  3.                 checkfiles('data/', '\.xml', 0);
  4.                 checkfiles('data/avatar/', '\.htm', 0);
  5.                 checkfiles('data/cache/', '\.htm', 0);
  6.                 checkfiles('data/ipdata/', '\.htm|\.dat', 0);
  7.                 checkfiles('data/template/', '\.htm', 0);
  8.                 checkfiles('data/threadcache/', '\.htm', 0);
  9.                 checkfiles('template/', '');
  10.                 checkfiles('api/', '');
  11.                 checkfiles('source/', '', 1, 'discuzfiles.md5');
  12.                 checkfiles('static/', '');
  13.                 checkfiles('archiver/', '');
  14.                 checkfiles('uc_client/', '\.php|\.htm', 0);
复制代码
下面的这些步骤,就是循环遍历目录及问价,然后也同样是进行md5操作,目的是和初始的md5串对比。
  1. foreach($discuzfiles as $line) {
  2.                         $file = trim(substr($line, 34));
  3.                         $md5datanew[$file] = substr($line, 0, 32);
  4.                         if($md5datanew[$file] != $md5data[$file]) {
  5.                                 $modifylist[$file] = $md5data[$file];
  6.                         }
  7.                         $md5datanew[$file] = $md5data[$file];
  8.                 }
复制代码
接下来就是拿初始的和后来md5的赋值处理,最后得出的结果既包含了修改的,又包含丢失的,改动过的,以备接着和新md5的数据尽心比对。
  1. $addlist = @array_merge(@array_diff_assoc($md5data, $md5datanew), $cachelist[2]);
  2.                 $dellist = @array_diff_assoc($md5datanew, $md5data);
  3.                 $modifylist = @array_merge(@array_diff_assoc($modifylist, $dellist), $cachelist[1]);
  4.                 $showlist = @array_merge($md5data, $md5datanew, $cachelist[0]);
复制代码
以上四句,分别为多出来的文件;丢失的文件;修改过的及未知的等等。都是通过array_diff_assoc函数,把初始的md5数据和新md5数据比对,得出结果。剩下的代码就是对一些要显示的变量进行赋值。
之前 写的一个可以独立运行的文件校验小脚本,就是通过这个原理来写的。


wjunnet 发表于 2011-9-28 13:32:30 | 显示全部楼层
您好我经过这个比对过了,但我的问题还是不能解决。之前已经出显了一次,我的网站上出显了别人的内容,也是用这个查过,后台上传了没解决,最后把所有的安装文件全部上传以后,好像有一些时间没有出可现在有出显了这种问题,https://discuz.dismall.com/thread-2396532-1-1.html
回复

使用道具 举报

老河口社区 发表于 2011-10-30 18:21:16 | 显示全部楼层
学习了,好文章!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|Discuz! 官方站 ( 皖ICP备16010102号 )star

GMT+8, 2024-11-23 22:11 , Processed in 0.072852 second(s), 4 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表