这两天公司负责的一个网站被不知名的人将网站程序中的所有 *.php 文件都加上了一段如下代码:
好吧,经过推敲鉴定这是网站被黑了的节奏,不幸的是程序并没有备份文件。那么有4种方法:
1、一个一个文件的改(虽然保险,但是这要改到猴年马月啊) 2、写一个方法,将文件中的这段代码去掉 3、重新写一份代码(这是作死的节奏啊,重写啊,不可能的吧) 4、华丽的将此网站抛弃(那更是不可能滴,它可是充实我们荷包的重要使者 )
这真是有爆粗口的冲动啊,但我们是文明人不是,不说脏话。无奈之下只能忍怒低头写代码;
分析一下:首先要将网站根目录下所有的php文件都要找出来,然后将文件中的那段不知名的代码给咔嚓掉,最后保存文件。为了一个不落的更改所有有误的文件,我们可以采用递归函数来达到目的。在网站的根目录下建一个find.php的文件来写这个方法,我们知道PHP中有个scandir() 函数;这个函数返回一个数组,包含指定路径中的文件和目录。有不了解的可以看看: 我们先试着输出所有的目录和文件:
function changeScandir($dir){ foreach(scandir($dir) as $single) { $sub_dir=$dir.DIRECTORY_SEPARATOR.$single; if($single=='.'||$single=='..') continue; elseif (is_dir($sub_dir)) { echo 'Directory '.$sub_dir.''; changeScandir($sub_dir); }else{ echo 'File '.$single.''; } }}changeScandir('.');
在此之前,我没有构造$sub_dir这个变量而是直接将$single传入递归,结果可想而知是不能正常运行的,还搞到Apache崩溃了。一开始我也很纳闷,还上网找了资料可是无果,后来跟我的同事一起讨论了一下,发现了是路径有问题。所以哇,遇到问题自己不能解决的时候一定要找找资料,再不行那就求助吧,多个人的力量总是比一个人的力量要大的;这可不是什么丢脸的事哦。
测试之后是可以正确输出所有目录和文件的,那接下来就好办了。我们只要判断文件是不是php文件,然后看有没有匹配到那可恨的代码,匹配成功就将这段代码替换为空,然后保存:
/', $cn, $arr); if(count($arr)>0) { //替换内容,更改文件内容 $result = preg_replace ('/<\?php(.*)x2f"\); \?>/', '', $cn); file_put_contents($sub_dir, $result); //记录更改了的文件 $str = $sub_dir."----Change Success!\n"; file_put_contents('test1.txt', $str,FILE_APPEND); } fclose($f); } } }}changeScandir('.');
至此,已经完成了我们所要达到的目的了;值得注意的地方就是要保证路径不出错,那其它的就没什么难度太大的问题存在了。好吧,最后让我小小的鄙视一下那些随意篡改别人程序的Hacker,请做文明Hacker哇!