专题页生成后内容错乱,标题与正文混杂
某天上午,客户突然反馈:网站专题页打开后,内容完全错乱——标题跑到正文位置,简介变成了图片alt属性,甚至有些专题页直接显示了其他栏目的文章列表,登录织梦后台查看,发现“生成-更新专题页”操作明明显示成功,但前端页面就是不对,更诡异的是,同一天内其他栏目页、文章页生成正常,唯独专题页批量“中招”。
织梦CMS专题页生成内容错误,从排查到恢复的全套运维实战指南
这种错误,90%的概率是文件被篡改或数据库被注入了恶意代码,剩下的10%可能是模板文件缓存冲突或PHP版本兼容问题,别急,按照我说的步骤来,从清理挂马到彻底修复,每一步都写清楚。
被挂马后的清理与恢复(1小时内完成)
第一步:紧急隔离
- 使用FTP或服务器面板,立刻将
/data/tplcache/目录下的全部文件备份到本地(命名如tplcache_bak_20250401),然后清空该目录。 - 删除
/plus/task.php和/plus/ad_js.php这两个高危文件(如果存在),很多挂马脚本会伪装成它们。 - 修改FTP和数据库密码,并立即停止服务器上的计划任务(如果有自动生成功能)。
第二步:扫描与清除
- 下载一份官方的织梦源码(版本必须与你当前使用的完全一致),用Beyond Compare或Diff工具比对以下核心目录:
/include//plus//dede/(后台目录)/data/(重点关注/data/config.cache.inc.php和/data/common.inc.php)
- 重点检查
/include/dedesql.class.php和/include/taglib/目录下的文件——挂马代码常藏在这里,如果发现文件末尾有多余的?>标签之后的内容,或出现不明加密函数(如eval(gzinflate(...),立刻用原始文件覆盖。 - 使用数据库管理工具(phpMyAdmin或Navicat),执行以下SQL清理常见木马:
DELETE FROM `dede_addonarticle` WHERE `body` LIKE '%base64_decode%'; DELETE FROM `dede_archives` WHERE `title` LIKE '%eval(%' OR `title` LIKE '%<script%'; DELETE FROM `dede_sysconfig` WHERE `varname` LIKE '%eval%';
第三步:恢复专题页正常生成
- 清空
/data/tplcache/目录后,进入织梦后台“系统-系统基本参数”,重新保存一次,刷新缓存。 - 手动进入“模板-默认模板管理”,任意选择一个专题模板,点击“编辑”,将模板内容全选复制,然后清空并重新粘贴保存(这步能刷新模板文件的CRC校验)。
- 回到“生成-更新专题页”,选择“全部专题”,但不要勾选“强制生成”,先勾选“仅更新HTML”,生成一次,如果此时页面正常,再跑一次“强制生成”覆盖全部。
后台路径修改方法(5分钟搞定)
根据织梦官方文档,后台目录名dede是黑客首要爆破目标,修改方法如下:
- 通过服务器面板,将
/dede/目录重命名为一个随机字符串,例如/admind8k2/。 - 修改
/data/admin/config.php文件(如果没有则新建),写入:<?php $cfg_admin_dir = '/admind8k2'; // 对应你重命名的目录名
- 修改
/admind8k2/login.php第2行,将require_once(dirname(__FILE__)."/../include/common.inc.php");这一行下面的:$cfg_admin_dir = '/dede'; // 改为 '/admind8k2'
- 检查所有后台入口文件(如
login.php、index.php、sys_info.php)头部,确保它们都使用你定义的新路径常量,完成修改后,登录时请用http://域名/admind8k2/访问。
文件权限安全设置(防止再次被上传木马)
织梦最脆弱的地方在于/uploads目录允许写入,强行锁定权限:
-
用SSH连接服务器(或使用宝塔面板),依次执行:
# 设置目录权限:755,文件644 find /www/wwwroot/你的网站/ -type d -exec chmod 755 {} \; find /www/wwwroot/你的网站/ -type f -exec chmod 644 {} \; # 重点锁定上传目录,禁止执行PHP chmod 444 /www/wwwroot/你的网站/uploads/ # 禁止uploads目录解析PHP(在Nginx配置中增加) location ~* /uploads/.*\.(php|php5)$ { deny all; } -
在
/data/目录下创建.user.ini文件,写入:open_basedir = /www/wwwroot/你的网站/:/tmp/ disable_functions = passthru,exec,system,chroot,chgrp,chown,shell_exec,proc_open,popen
-
删除
/install/目录,并修改/data/common.inc.php为只读(444权限)。
整站搬家完整流程(从旧服务器迁移到新服务器)
场景:服务器到期,需要完整迁移织梦网站,包括数据库、附件、模板、配置。
-
准备阶段:
- 在新服务器创建相同版本的PHP环境(推荐PHP 7.4或8.0,织梦需要关闭
opcache和fileinfo)。 - 创建空数据库,字符集设置为
utf8_general_ci。
- 在新服务器创建相同版本的PHP环境(推荐PHP 7.4或8.0,织梦需要关闭
-
文件打包:
- FTP下载所有文件,除
/data/tplcache/和/data/runtime/目录(这些缓存文件不迁移)。 - 打包后上传到新服务器相同路径。
- FTP下载所有文件,除
-
数据库导出:
mysqldump -u用户名 -p密码 数据库名 > /tmp/dede_backup.sql
注意:如果数据库大于100MB,建议使用
--routines --triggers选项单独导出事件和触发器,避免中断。 -
导入新库:
mysql -u新用户名 -p新密码 新数据库名 < /tmp/dede_backup.sql
-
修改配置:
- 编辑
/data/common.inc.php,修改$cfg_dbhost、$cfg_dbname、$cfg_dbuser、$cfg_dbpwd为新库信息。 - 修改
/data/config.cache.inc.php中的数据库连接参数。 - 如果旧域名需要更换,同时修改
$cfg_basehost为临时IP或新域名。
- 编辑
-
更新缓存: 进入新后台“系统-系统基本参数-保存”,系统-数据缓存-清除缓存”。
域名更换后数据替换技巧(彻底无残留)
当更换域名时,织梦的数据表中存储了大量的绝对URL(比如src="/uploads/image.jpg"),必须全部替换。
- 先在
/data/common.inc.php中将$cfg_basehost改为新域名。 - 进入phpMyAdmin,执行以下SQL:
UPDATE `dede_addonarticle` SET `body` = REPLACE(`body`, 'http://旧域名.com', 'http://新域名.com'); UPDATE `dede_arctype` SET `typedir` = REPLACE(`typedir`, 'http://旧域名.com', 'http://新域名.com'); UPDATE `dede_archives` SET `litpic` = REPLACE(`litpic`, 'http://旧域名.com', 'http://新域名.com'); UPDATE `dede_member` SET `userid` = REPLACE(`userid`, '@旧域名.com', '@新域名.com'); -- 如果有邮件字段
- 重要:在
/data/目录下搜索所有.php文件,用批量文本替换工具(如VSCode的全局替换)将旧域名替换为新域名,防止后台某些页面硬编码URL。 - 清空
/data/tplcache/目录,重新生成全站首页和所有栏目页。
数据库备份和恢复操作(零失误方案)
备份(每天自动执行):
- 在服务器上创建备份脚本
/root/backup_dede.sh:#!/bin/bash DATE=`date +%Y%m%d_%H%M%S` DB_NAME="你的数据库名" DB_USER="用户名" DB_PASS="密码" BACKUP_DIR="/backup/dede" mkdir -p $BACKUP_DIR mysqldump -u$DB_USER -p$DB_PASS $DB_NAME --routines --triggers --single-transaction > $BACKUP_DIR/dede_$DATE.sql # 删除7天前的备份 find $BACKUP_DIR -name "*.sql" -mtime +7 -delete
- 设置crontab定时任务:
0 3 * * * /bin/bash /root/backup_dede.sh
- 同时备份网站文件(排除缓存目录):
tar -czf /backup/dede/dede_files_$DATE.tar.gz /www/wwwroot/你的网站/ --exclude='/www/wwwroot/你的网站/data/tplcache'
恢复(按需执行):
- 如果数据库损坏,使用:
mysql -u用户名 -p密码 数据库名 < /backup/dede/dede_20250401_030000.sql
- 如果文件被篡改,解压文件备份覆盖:
tar -xzf /backup/dede/dede_files_20250401_030000.tar.gz -C /
- 恢复完成后,务必立即修改后台密码,并检查
/data/tplcache/目录是否被写入了恶意缓存。
专题页生成错误的核心原因往往是缓存文件被植入了恶意代码,或者数据库中的dede_arctype表里的typedir字段被篡改,严格按照以上流程操作,每次只做一个小步骤并立即验证,别被“生成成功”的假象骗了——生成后去前端F12检查HTML源码,如果发现<script src="http://恶意域名"></script>,立刻回到第二步,重新扫描整个/plus/目录,织梦的安全运维没有捷径,但照着做,80%的挂马问题都能在1小时内解决。



发表评论