PHP 网页病毒清除类实现与使用指南
针对网站频繁被植入木马、ASP/JS 后门等问题,本文分享一个基于 PHP 的轻量级病毒清除类。该工具无需复杂配置,只需准备病毒特征库和目标文件列表,即可自动执行扫描与清理操作,比人工逐行删除更高效。
核心逻辑与工作流程
该程序的核心思想是“白名单扫描”结合“字符串替换”。它并不依赖复杂的特征码匹配引擎,而是通过比对已知的高危代码片段,直接在源文件中将其剔除。整个流程分为以下几个阶段:
第1步:加载病毒特征库
程序初始化时,首先需要读取配置好的病毒特征列表文件。这个文件通常是一个纯文本文件,每行包含一个需要被删除的特定代码片段(如恶意跳转 URL 或隐藏的 iframe 标签)。如果文件不存在或格式错误,程序会中断并报错。这一步的目的是建立待清除对象的基准库。
第2步:验证感染状态
在执行大规模清理前,程序会检查一个特定的监控文件(如 e.php)。该文件的存在与否以及其内容是否包含病毒特征,用于判断当前环境是否确实存在感染风险。这可以避免在干净的系统上无意义地运行扫描脚本,节省服务器资源。若检测到明确的可疑内容,则激活清理标志位 $run = 1。
第3步:遍历并清洗目标文件
这是最关键的步骤。程序读取另一个配置文件,获取需要被扫描的所有文件路径列表。随后逐个打开这些文件:
- 读取文件全部内容至内存;
- 循环比对之前加载的病毒特征库;
- 一旦发现匹配的特征字符串,立即使用
str_replace将其替换为空字符串; - 若标记为已修改(
$tag = 1),则以写入模式覆盖原文件。
第4步:记录清理日志
当确认有文件被执行了清理操作后,程序会将当前的时间戳追加到一个日志文件(time.txt)中。这有助于管理员后续审计哪些时间点进行了安全维护。
完整代码实现
以下是完整的 PHP 类代码。请注意,这段代码仅作为演示原理之用,在实际生产环境中直接使用需极为谨慎,建议先对文件进行备份。
<?php
Class clear_virus {
public $infectFile = 'virus.txt'; // 病毒特征文件列表路径
public $savefile = "save.txt"; // 待查杀的文件列表路径
public $timep = 'time.txt'; // 清理记录日志文件
public $checkFile = 'e.php'; // 监控检测文件,用于触发扫描
public $run = 0; // 是否执行扫描的标志位
public $virus_type; // 存储读取到的病毒特征数组
public $replace; // 临时存储病毒文件内容
public $filepath ; // 存储待查杀的文件路径数组
public $tag = 0; // 本次处理是否发现病毒
public $content; // 文件内容缓存
function open_file() {
$this->read_virus(); // 读取病毒库
$this->check_File(); // 检查是否触发扫描
if($this->run) { // 若处于激活状态
$this->update_time(); // 记录开始时间
$this->read_file(); // 读取待查杀文件列表
foreach($this->filepath as $tmppath) {
if(file_exists($tmppath)) {
$tmp_file = file_get_contents($tmppath);
print_r( $this->virus_type);
for( $i=0;$i<sizeof($this->virus_type);$i++ ) {
// 使用 strrpos 查找子串,忽略大小写可进一步改进
if( strrpos($tmp_file,$this->virus_type[$i])!== false) {
// 执行替换
$tmp_file = str_replace($this->virus_type[$i],'',$tmp_file);
$this->tag = 1;
}
}
// 只有发现过病毒特征才重新写入文件
if( $this->tag ) {
$handle =fopen($tmppath,'w');
fwrite($handle,$tmp_file);
fclose($handle);
unset($tmp_file);
}
} else {
echo "File not found: ".$tmppath; // 兼容原有逻辑提示
}
}
}
}
function check_File() {
if(file_exists($this->checkFile)) {
$temp =file_get_contents($this->checkFile) ;
foreach( $this->virus_type as $v_tmp ) {
if( strrpos($temp,$v_tmp)!== false ) {
$this->run = 1;
break;
}
}
unset($temp);
} else {
$this->show_error(5);
}
}
function update_time() {
if(file_exists($this->timep)) {
$tmp_time =date("Y-m-d H:i:s").chr(13).'|';
$tmp_fp =fopen($this->timep,'a+');
fwrite($tmp_fp,$tmp_time);
fclose($tmp_fp);
}
}
function read_file(){
if(file_exists($this->savefile)) {
$this->content =file($this->savefile);
if(is_array($this->content)){
$this->filepath =$this->content;
} else {
$this->show_error(3);
}
} else {
$this->show_error(4);
}
}
function read_virus(){
if(file_exists($this->infectFile)) {
$this->replace =file($this->infectFile);
if(is_array($this->replace)){
$this->virus_type=$this->replace;
} else {
$this->show_error(1);
}
} else {
$this->show_error(2);
}
}
function show_error($number) {
$array = array(
'1' =>'病毒特征文件内容不能读取!',
'2' =>'病毒特征文件列表不存在!',
'3' =>'待查杀的文件列表不存在',
'4' =>'查杀的目标文件不存在',
'5' =>$this->checkFile.'不存在,请设置病毒感染监测文件'
);
echo isset($array[$number]) ? $array[$number] : 'Unknown Error';
}
}
// 实例化并运行
$virus = new clear_virus;
$virus->open_file();
?>
使用前注意事项与排错
在使用此类脚本进行服务器维护时,请务必关注以下几点:
数据备份风险提醒
上述代码直接使用 fwrite 覆盖了原始文件。虽然逻辑上是“只删除病毒片段”,但如果特征库匹配失误,或者病毒代码恰好与正常业务代码高度重合,可能导致正常功能损坏。在生产环境运行前,务必对整个网站目录或关键文件进行完整备份。
外部依赖文件配置
该类的运行依赖于三个外部文本文件,必须在同一目录下正确创建:
virus.txt:存放具体的恶意代码字符串。每行一个片段。例如某段 JS 木马:<script src=http://evil.com/a.js></script>。save.txt:存放需要扫描的文件路径列表。每个文件占一行,支持相对路径或绝对路径。e.php:这是一个简单的触发性文件。你可以保持其为空,或者在其中放入常见的后门特征,一旦检测到它的变化即触发清理(具体取决于你的监控策略)。
常见错误排查
- 报错“病毒文件未不能读取” (Error 1):通常是因为
virus.txt中包含不可见的乱码或非 UTF-8 编码字符。建议使用标准的 ASCII 或 UTF-8 无 BOM 格式保存。 - 报错“文件列表不存了” (Error 3/4):检查
save.txt中的路径是否正确,特别是 Windows 和 Linux 下的路径分隔符差异(建议使用正斜杠/)。 - 权限问题:Web 服务器用户(如 www-data 或 IUSR)必须对目标文件拥有读写权限(777 或 666),否则文件覆盖将失败且无提示。
简要总结
这套 PHP 病毒清除类提供了一种简单直接的解决方案,适合应对那些通过简单注入方式传播的低级木马攻击。通过精确控制特征库,管理员可以在保留网站源码结构的同时,高效地抹除恶意痕迹。 以上就是 PHP 网页病毒清除类实现原理与使用方法的详细内容,更多关于 PHP 安全防护的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









