PHP 文件保护系统部分代码

上篇文章说的PHP文件保护系统,感觉挺高大上,其实真做起来没什么难度,本文大致上把需要用到的知识和函数说一下,附上部分代码.

为了简单起见,就做了一个简单的例子,仅仅只检测当前脚本目录下的文件.

一.数据库

表名:
protection

字段:
文件名:file  varchar(64),
最后修改时间:  time int(64) ,
初始sha1: sha1 text(32),
当前sha1: now_sha1 text(32),

二.关键代码

1.初始化

if ($handle = opendir('./')) {
	mysql_query('TRUNCATE TABLE protection');
	while (false !== ($file = readdir($handle))) {
		if ($file != "." && $file != "..") {
			if(!mysql_query('insert into protection (file,time,sha1)value(\''.$file.'\',\''.time().'\',\''.sha1_file($file).'\')'))
				die(mysql_error());
			}
		}
	}

2.再次检测文件

if ($handle = opendir('./')) {
	mysql_query('update protection set now_sha1=\'\'');
	while (false !== ($file = readdir($handle))) {
		if ($file != "." && $file != "..") {
			mysql_query('update protection set now_sha1=\''.sha1_file($file).'\' where file =\''.$file.'\'');
			mysql_query('insert into protection (file,now_sha1) value (\''.$file.'\',\''.sha1_file($file).'\')');
			}
		}
	}

3.文件状态判断条件

//首先读取数据库
$result = mysql_query('select * from protection');

//然后依次检测每条数据:
while($row = mysql_fetch_array($result)){
  //检测代码
}

//以下是检测过程中对文件状态的判断条件,具体判断过程可根据自己需要来写.

//新增文件:
$row['sha1']==null && $row['now_sha1'] != null

//删除文件:
$row['sha1']!=null && $row['now_sha1'] == null

//正常文件:
$row['sha1']==$row['now_sha1'] && $row['sha1'] && $row['now_sha1']

//初始化时没有的文件,之前检测存在而现在检测不存在的文件(可能是上传的后门,利用好了后被攻击者删除了)
!$row['sha1'] && !$row['now_sha1']

//其他情况就是被修改过的文件了.

由于我的保护系统对接了其他程序,里面有一些乱七八糟的接口,检测结果的输出方式也很混乱,不方便直接全部贴出来,而且直接贴出来这么凌乱的代码估计新手也看不大明白,要是有空,我把代码整理一下在上传好了,要是有什么疑问,可以留言.

PHP 文件保护系统

近期虚拟主机莫名其妙被攻击,持续每秒几十次访问搞了几天,后台错误日志又发现wordpress程序似乎有代码进入了死循环,最后不出预料的服务器被主机提供商暂停了,原因自然是大量占用服务器资源.

外部攻击除了屏蔽ip,也没有太好的方法,不过内部问题倒是要想办法做做,出了这么大问题,也怕是有人发现了wordpress漏洞攻击了,总担心站点文件被修改,怕上传了后门,干脆清空了主机,重新安装了wordpress.真是逼死强迫症…

然后就想,以后再出事怎么搞,总不能出问题就重装wordpress,于是考虑做一个文件保护系统,基本原理就是记录文件修改时间和文件md5值来检测服务器文件有没有被修改.

项目详细实现:

1.保护系统初始化时,开始检测所有已存在文件的修改时间和md5值,把文件名-修改时间-md5存到数据库.

2.每次打开网站,指定一个周期,再次检测所有文件,对比数据库,列出被修改,删除,新增的文件.

3.部分缓存文件经常变动,需要单独列出来.

4.检测结果发现异常后,标识出异常文件,确认无威胁或以解决问题后,可以重新初始化系统.

更进一步开发:

5.计划任务,让该系统后台间隔一定时间后自动执行,并把检测结果发送到指定邮箱.

6.每次检测时,备份数据库文件,并发送到邮箱.

7.备份重要文件,这个有点不靠谱,毕竟副本存在服务器上也没什么安全性,发到邮箱每次消耗的流量更惨不忍睹,不过要是重要文件打包压缩存在服务器,给邮箱发下载链接,定期主动下载倒还可以.