凌晨三点,运维群里的消息提示音急促响起:“专题页生成一直转圈,最后显示‘生成失败’!” 我放下咖啡,登录服务器,发现后台的反应速度明显变慢,数据库查询频繁报错,作为织梦CMS的“老维修工”,这类故障背后往往不止是模板问题——八成是被人挂了暗链或后门。
第一步:被挂马后的应急清理与恢复
不要急着重新生成专题页,挂马文件通常会伪装成模板文件或API接口,导致生成进程被劫持。
清理流程:
织梦CMS专题页生成失败,从应急清理到整站迁移的硬核实操手册
- 检查近期修改的文件:在服务器根目录执行
find ./ -mtime -3 -type f -name "*.php",列出最近3天被修改的PHP文件,挂马文件常出现在plus/、include/、data/目录下。 - 比对MD5值:从织梦官方下载同版本完整包,用
md5sum对比关键文件,常见被篡改的文件包括include/common.inc.php、include/dedesql.class.php。 - 清除数据库中的恶意代码:登录phpMyAdmin,执行SQL查询:
SELECT * FROM `dede_sysconfig` WHERE `varname` LIKE '%eval%' OR `value` LIKE '%base64_decode%';
发现可疑值后立即删除,并检查
dede_addonarticle等核心数据表内容。 - 重命名后门文件:不要直接删除,以防文件被守护进程重建,先将可疑文件重命名为
.bak后缀,观察24小时无异常后再清除。
恢复建议: 从备份中提取最新的干净模板文件,替换 templets/ 目录下的对应文件,若专题页生成仍有问题,检查 data/tplcache/ 缓存目录,清空其中的全部文件。
第二步:修改后台路径,阻断攻击
默认后台路径 /dede/ 是攻击者的首选目标,改路径分两步:
- 重命名后台目录:将
/dede/改为难以猜解的名称,/_admin_2024/。 - 修改配置文件:编辑
data/admin/config.php,找到$cfg_admin_dir变量,将其值改为新的路径名,若不修改此配置,后台无法正常访问。
额外防护: 在 config.php 中添加IP白名单限制:
$allowed_ips = array('你的固定外网IP');
if(!in_array($_SERVER['REMOTE_ADDR'], $allowed_ips)){
die('Access Denied');
}
第三步:文件权限安全设置
很多被挂马案例源于目录权限过于宽松,参照以下安全基线设置:
- 目录权限(755):除
data/、uploads/、a/外的所有目录设为755。 - 文件权限(644):PHP文件和静态文件设为
644,禁止可执行权限。 - 特殊目录(777):
data/、uploads/、a/设为777,否则后台无法生成专题页或上传文件。 - 禁止跨目录执行:在
web.config或.htaccess中限制:php_admin_value open_basedir "/var/www/html:/tmp:/proc"
验证方法: 手动创建一个测试文件 chmod_test.php,写入 <?php echo fileperms('.');?>,访问该文件,返回40755表示目录权限为755,正常;若返回40777` 则为777,存在风险。
第四步:整站搬家完整流程
若服务器环境陈旧或遭受持续攻击,整站迁移是根治方案。
搬家清单:
- 数据库导出:使用mysqldump命令或phpMyAdmin导出完整数据库,选择“结构和数据”,勾选“添加DROP TABLE”确保恢复时无冲突。
- 文件压缩:使用tar命令打包全站:
tar -czvf site_backup_20240516.tar.gz /var/www/html - 配置文件迁移:特别注意
data/common.inc.php,它包含数据库连接信息,此文件不在备份包中,需单独复制。 - 目标服务器部署:
- 解压文件到新目录
- 导入SQL文件:
mysql -u用户名 -p 数据库名 < backup.sql - 修改
data/common.inc.php中的数据库连接信息(主机、用户名、密码、数据库名)
常见陷阱: 若新服务器PHP版本不同,需调整 include/common.inc.php 中的 error_reporting 级别,否则专题页可能因兼容性问题生成失败。
第五步:域名更换后数据替换技巧
域名变更后,专题页链接仍是旧域名,导致生成路径错误。
替换SQL语句:
UPDATE `dede_arctype` SET `typedir` = REPLACE(`typedir`, '旧域名', '新域名'); UPDATE `dede_addonarticle` SET `body` = REPLACE(`body`, '旧域名', '新域名'); UPDATE `dede_archives` SET `description` = REPLACE(`description`, '旧域名', '新域名');
若专题页使用了自定义字段,还需额外查询:
SELECT * FROM `information_schema`.`COLUMNS` WHERE `TABLE_SCHEMA`='你的数据库名' AND `TABLE_NAME` LIKE 'dede_%' AND (`DATA_TYPE`='varchar' OR `DATA_TYPE`='text');
根据结果,对包含路径的字段执行REPLACE操作。
配置文件更新: 修改 data/common.inc.php 中的 $cfg_basehost 变量,或直接修改 include/config.base.php 中的默认域名配置。
第六步:数据库备份与恢复操作
日常备份是最后的安全网。
自动备份脚本(每周日执行):
#!/bin/bash DATE=$(date +%Y%m%d) mysqldump -u运维账号 -p'复杂密码' 织梦数据库 > /backup/dedecms_$DATE.sql gzip /backup/dedecms_$DATE.sql find /backup -mtime +30 -delete
单表恢复技巧: 专题页生成失败,不影响整个站点时,只恢复 dede_arctype 和 deda_addonarticle 两个表:
mysql -u账号 -p密码 数据库名 < dedecms_20240501.sql --ignore-table=数据库名.dede_member
异地备份: 使用scp命令将备份文件传输到另一台服务器或云存储:
scp /backup/dedecms_*.sql.gz 备份服务器:/remote_backup/
当专题页生成成功的提示弹出时,我知道问题解决了,但真正的运维工作,永远是在下一次崩溃前,提前筑好防线。



发表评论