PHP实现批量删除挂马文件及页面内容替换脚本
分享一个使用PHP编写的批量处理脚本,通过遍历指定目录及其子目录,对符合特定后缀名的文件进行字符串或正则匹配替换。该方法常被用于快速清除被黑客植入的恶意代码(如JS挂马链接)或在大型项目中统一替换废弃接口与文案,具备自动化程度高、操作直观的特点。
功能目标
本脚本的核心目的是解决以下两类问题:
- 安全应急:当网站遭遇批量注入攻击,文件中混入大量恶意脚本代码时,手动逐个修复效率极低。此工具可定位包含特定恶意特征码的文件并清除或替换。
- 批量重构:在更换域名、修改全局配置或规范代码风格时,需要成百上千个HTML/PHP/JS文件中统一更新某些片段,避免遗漏。
准备条件
- 服务器环境需支持
PHP运行,且当前运行用户(通常是www-data或nobody)拥有目标文件夹及文件的写入权限。 - 由于涉及文件覆盖操作,务必提前对整个站点目录进行完整备份。
- 如果文件数量庞大,需要在
php.ini中将max_execution_time设置得足够大,或直接使用脚本开头的set_time_limit(3600);防止中途超时中断。
第1步:脚本核心逻辑解析
脚本分为两部分:一部分是纯 PHP 后台处理逻辑,另一部分是前端的 HTML 表单交互界面。
在处理逻辑中,首先通过 explode("|", $shortname) 将用户输入的逗号分隔的文件后缀(如 php|htm)转换为数组 $arrext。随后进入遍历阶段:
- 非递归模式(hx_dealdir):仅扫描根目录下的单层文件,利用
opendir()和readdir()组合进行判断,筛选出目标后缀文件后读取内容。 - 递归模式(hx_dirtree):遇到
"."或".."则跳过,若is_dir()为真则继续深入子目录,否则作为文件处理。这种深度优先搜索策略确保了能覆盖所有层级。
第2步:执行内容替换与校验
找到目标文件后,使用 file_get_contents() 读取原始内容。此时根据 isreg 参数决定替换方式:
- 若未勾选正则,采用原生函数
str_replace($sstr, $rpstr, $body)进行全量文本替换。 - 若勾选了“使用正则表达式”,则调用
preg_replace($sstr, $rpstr, $body),这允许输入类似</script><script src="http://evil.com/a.js"></script>这样复杂的匹配规则来精准剔除木马。
替换后的内容存入 $body2,脚本通过比较 $body != $body2 确认是否发生过实际变动。若变动发生且新内容不为空,则进入保存环节;否则标记为 NO,不产生无效写操作。
第3步:安全写入新文件
在 tofile() 函数中,为了保证原子性操作并降低并发风险,脚本采取了一种较为保守的写入手段:
- 先检测文件是否存在,若存在则
unlink()删除旧文件。 - 新建文件句柄并使用
fopen(..., "w")。 - 检查文件是否
is_writable(),若不具写入权限直接返回 false。 - 通过
fwrite()将修正后的字符串写入磁盘,最后fclose()关闭句柄。
这种机制虽然比直接 file_put_contents 繁琐,但在某些严格限制的系统环境下提供了更明确的错误反馈。
第4步:部署与操作界面配置
将上述代码保存为一个单独的 PHP 文件(例如 batch_replace.php)。浏览器访问该页面后会看到一个简洁的控制台:
- 起始根路径:默认值为
./test。建议填写绝对路径(如/var/www/html)以避免跨目录误伤或权限问题。末尾不要加斜杠,程序已做兼容修剪。 - 文件扩展名:多个类型间用竖线
|隔开,例如php|html|js|css。 - 替换内容选项:
- “替换内容”框:填入要被清除的代码块。
- “替换为”框:如果需要彻底删除,留空即可。如果需要更改链接地址,在此填入新的 URL。
- 勾选“使用正则表达式”:开启高级匹配模式。
点击“开始执行操作”后,表单会通过 iframe 提交至自身,结果会实时滚动显示在当前页面底部,便于监控进度和排查异常。
完成判断与排错
成功标志:控制台列表项末尾显示 OK,且对应目录下文件的时间戳发生变更。
常见问题排查:
- 权限不足:如果出现
wrong或者没有反应,检查 Web 服务用户对目标文件夹是否有写权限(通常执行chmod -R 755 /your/path并在必要时调整属主)。 - 乱码问题:脚本注释明确指出仅适用于 UTF-8 编码的页面。如果你的老系统使用的是 GBK,请先在终端用
iconv命令转换全库编码后再运行此脚本。 - 内存溢出:面对几十兆甚至上百兆的大型文件,
file_get_contents一次性读入可能会导致 PHP 内存耗尽。这种情况下建议改用分块流式处理,或对超大文件单独提取修复。
简要总结
以上关于PHP实现批量删除挂马文件及批量替换页面内容的详细内容,更多关于PHP批量文件处理优化的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













