PHP 网页病毒清除类实现与使用指南

Chloe
Chloe
发布时间:2026-10-14| 4人浏览过
原创

针对网站频繁被植入木马、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 覆盖了原始文件。虽然逻辑上是“只删除病毒片段”,但如果特征库匹配失误,或者病毒代码恰好与正常业务代码高度重合,可能导致正常功能损坏。在生产环境运行前,务必对整个网站目录或关键文件进行完整备份。

外部依赖文件配置

该类的运行依赖于三个外部文本文件,必须在同一目录下正确创建:

  1. virus.txt:存放具体的恶意代码字符串。每行一个片段。例如某段 JS 木马:<script src=http://evil.com/a.js></script>。
  2. save.txt:存放需要扫描的文件路径列表。每个文件占一行,支持相对路径或绝对路径。
  3. 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 安全防护的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。