批量生成中断的现场还原
凌晨三点,网站后台“批量生成”按钮点击后,屏幕卡死在“正在生成第47/500条”的进度条上,服务器CPU飙升至98%,网站前台出现大量JS弹窗广告,这是典型的织梦CMS被植入后门后的连锁反应——黑客利用生成功能调用异常进程,在服务器上创建大量恶意文件。
挂马后的紧急清理流程
第一步:终止异常进程
登录服务器SSH,执行ps aux | grep php,找到占用CPU最高的PHP进程,执行kill -9 [PID],随后立即修改服务器密码、数据库密码、FTP密码。
第二步:定位木马文件
使用命令find /www/web -name "*.php" -mmin -60查找最近一小时修改的PHP文件,重点检查/data/tplcache/、/include/、/plus/目录下的不明文件,如ajax_log.php、php等典型木马文件名。
第三步:手动清除挂马代码
用grep -r "eval(" /www/web --include="*.php"搜索所有调用了eval函数的可疑行,优先排查/include/archives.func.php、/include/common.inc.php这两个核心文件,将恶意代码段整体删除,注意:不要删除整个文件,仅清理被篡改的部分。
织梦CMS批量生成中断,从应急清理到系统加固的完整技术手册
第四步:恢复被篡改的系统文件
从织梦CMS官方下载同版本安装包,解压后覆盖以下目录:/include/(核心函数库)、/plus/(功能模块)、/data/(排除tplcache和sqlite等数据目录),特别注意:切勿覆盖/data/config.cache.inc.php配置文件。
后台路径深度修改方案
修改登录入口名称
将后台管理目录(如/dede/)更改为随机字符串,例如改为/7k8d9e/。
操作步骤:
- 通过FTP重命名后台目录
- 修改
/data/config.cache.inc.php中$cfg_admin_path变量的值为/7k8d9e/ - 同时修改
/7k8d9e/目录下login.php中的$cfg_admin_path变量
禁用默认后台入口
在网站根目录.htaccess文件中添加规则:
RedirectMatch 403 ^/dede/.*$
Apache环境下可彻底屏蔽旧路径访问。
二次验证加固
在后台目录下创建.htaccess文件,限制仅允许特定IP访问:
order allow,deny
allow from 你的IP地址
deny from all
文件权限安全设置清单
目录权限标准(755/644原则)
- 所有目录:755(owner可读写执行,group和others可读执行)
- 所有文件:644(owner可读写,group和others只可读)
- 配置文件
/data/config.cache.inc.php:400(仅owner可读)
敏感目录权限调整
| 目录 | 建议权限 | 说明 |
|------|----------|------|
| /data/ | 755 | 禁止写入执行权限 |
| /uploads/ | 755 | 禁止PHP执行权限 |
| /data/tplcache/ | 755 | 定期清理缓存文件 |
| /plus/ | 755 | 禁止写入新文件 |
禁止PHP执行的黑名单目录
在/uploads/目录下的.htaccess添加:
<FilesMatch "\.php$">
Order Deny,Allow
Deny from all
</FilesMatch>
整站搬家完整操作流程
环境准备阶段
- 在新服务器安装相同版本的PHP(推荐7.4)、MySQL(5.7+)、Apache/Nginx
- 创建数据库和用户,赋予全部权限
- 记录新服务器的绝对路径(如
/home/wwwroot/)
数据迁移步骤
- 在旧服务器执行
tar -czf website_backup.tar.gz /www/web打包所有文件 - 通过SCP命令传输到新服务器:
scp website_backup.tar.gz root@新IP:/home/ - 解压后修改
/data/config.cache.inc.php中的数据库连接信息:$cfg_dbhost = 'localhost'; // 新数据库地址 $cfg_dbname = 'new_database'; // 新数据库名 $cfg_dbuser = 'new_user'; // 新数据库用户 $cfg_dbpwd = 'new_password'; // 新数据库密码
数据库迁移验证
登录phpMyAdmin,导出旧数据库SQL文件,导入到新数据库,重点检查#@__arctype(栏目表)和#@__archives(文章表)的记录数是否一致。
域名更换后的数据替换技巧
全局域名替换命令
在MySQL中执行:
UPDATE `#@__sphinx` SET `title` = REPLACE(`title`, 'old.com', 'new.com'); UPDATE `#@__archives` SET `writer` = REPLACE(`writer`, 'old.com', 'new.com'); UPDATE `#@__addonarticle` SET `body` = REPLACE(`body`, '旧域名', '新域名'); UPDATE `#@__verifies` SET `body` = REPLACE(`body`, 'http://old.com', 'https://new.com');
数据库外链批量修改工具
使用Edbale工具扫描全库,生成替换脚本:
./edbale -h localhost -u root -p密码 -d 数据库名 -s 'old.com' -r 'new.com' --dry-run
确认无误后去掉--dry-run执行实际替换。
网站配置文件调整
修改/data/config.cache.inc.php:
$cfg_basehost = 'https://new.com'; $cfg_cmspath = ''; // 如果安装在根目录则为空
数据库备份与恢复操作手册
命令行备份(推荐生产环境使用)
# 单表备份(备份文章表) mysqldump -u root -p 数据库名 #@__archives > archives_backup.sql # 全库备份(含存储过程) mysqldump -u root -p --routines --events --triggers 数据库名 > full_backup.sql # 压缩备份 mysqldump -u root -p 数据库名 | gzip > backup_$(date +%Y%m%d).sql.gz
恢复操作
# 恢复前先清理旧数据 mysql -u root -p -e "DROP DATABASE IF EXISTS 数据库名; CREATE DATABASE 数据库名 CHARACTER SET utf8mb4;" # 导入数据 mysql -u root -p 数据库名 < full_backup.sql # 如果导入压缩包 gunzip < backup_20231001.sql.gz | mysql -u root -p 数据库名
增量备份自动化脚本
创建/root/backup.sh:
#!/bin/bash BACKUP_DIR="/backup/mysql" DATE=$(date +%Y%m%d_%H%M%S) mysqldump -u root -p密码 --single-transaction --flush-logs 数据库名 | gzip > $BACKUP_DIR/$DATE.sql.gz find $BACKUP_DIR -type f -mtime +7 -delete
加入crontab:0 3 * * * /root/backup.sh
批量生成功能修复
修复生成引擎
删除/data/tplcache/下所有缓存文件,重新生成首页:
登录后台 -> 生成 -> 更新系统缓存 -> 一键更新所有文档HTML
关闭不必要的生成功能
后台 -> 系统 -> 系统基本参数 -> 性能选项:
- 关闭“生成使用ajax方式”
- 将“批量生成文档每次生成数目”设为50
- 启用“生成时检查时间间隔”为5秒
终极防护:锁定核心文件
使用chattr +i命令锁定关键文件:
chattr +i /www/web/include/common.inc.php chattr +i /www/web/include/archives.func.php chattr +i /www/web/data/config.cache.inc.php
完成以上所有步骤后,你的织梦CMS已从被挂马的瘫痪状态,恢复为具备生产环境安全防护能力的完整系统,任何安全加固方案都不是一劳永逸的,每月定期执行一次文件完整性检查(可配合aide工具),才是长期稳定运行的根本保障。



发表评论