一个深夜的报警短信
凌晨3点17分,手机震动,服务器监控告警:CPU持续100%占用,网站访问超时,远程登录一看,网站首页被篡改,织梦后台手动生成HTML页面全部失败——点击“一键更新”后进度条卡住不动,浏览器控制台报500错误,更糟的是,查看生成文件目录,发现大量不明PHP文件,后缀名伪装成“.php.bak”“.php.jpg”。
织梦CMS手动生成失败?别慌,这份安全运维指南能救你的站
这种场景,对于维护过织梦CMS的人来说再熟悉不过,手动生成失败,往往是站点被挂马后的第一个明显信号。
第一步:紧急止血——挂马清理与站型恢复
1 切断攻击路径
立刻修改数据库连接密码、FTP密码、服务器SSH密码,这是为了阻断攻击者继续写入文件的通道。
2 定位恶意文件
使用命令快速扫描:
find /www/wwwroot/你的站点目录 -type f -name "*.php" -mtime -7
重点查看最近7天修改过的PHP文件,恶意文件通常藏在:
/data/目录下的缓存文件夹/include/核心目录的乱码文件名/plus/下的可疑文件
3 清理操作
先将疑似恶意文件移动到一个备份目录,不要直接删除:
mkdir /tmp/malware_backup mv /www/wwwroot/你的站点目录/data/cache/*.php /tmp/malware_backup/
然后从干净的织梦官方安装包中,覆盖核心目录:
wget http://www.dedecms.com/下载最新包 tar -xzf dedecms_latest.tar.gz cp -r dedecms/include /www/wwwroot/你的站点目录/ cp -r dedecms/plus /www/wwwroot/你的站点目录/
4 最关键一步:修复数据库
使用phpMyAdmin或命令行连接数据库,执行:
UPDATE `dede_admin` SET `pwd`=MD5('新密码') WHERE `id`=1;
这是重置管理员密码,防止攻击者用webshell通过后台漏洞操作。
完成后,手动生成尝试一下:登录后台,点击“生成”——“更新主页HTML”,如果还失败,说明文件权限或核心文件损坏。
第二步:后台路径修改——让攻击者找不到门
织梦默认后台路径是/dede/,这是众所周知的软肋。
1 修改目录名
mv /www/wwwroot/你的站点目录/dede /www/wwwroot/你的站点目录/admin_新随机名
2 修改配置文件
打开/admin_新随机名/login.php,找到:
define('DEDEADMIN', str_replace("\\", '/', dirname(__FILE__)));
确保路径正确。
3 更新系统检测路径
在数据库的dede_sysconfig表中,查找cfg_admin_path字段,改为新的路径名。
4 再设一道防线
在后台登录页面增加IP白名单:
// 在login.php顶部加入
$allowed_ips = array('你的办公IP', 'vpn内网IP');
if(!in_array($_SERVER['REMOTE_ADDR'], $allowed_ips)) {
header('HTTP/1.1 403 Forbidden');
exit('禁止访问');
}
第三步:文件权限安全设置——织梦的七寸
1 核心目录只读权限
chmod 755 /www/wwwroot/你的站点目录/dede
chmod 644 /www/wwwroot/你的站点目录/dede/*.php
chmod 755 /www/wwwroot/你的站点目录/include
chmod 644 /www/wwwroot/你的站点目录/include/*.php
2 上传目录严格限制
chmod 444 /www/wwwroot/你的站点目录/uploads
find /www/wwwroot/你的站点目录/uploads -type f -name "*.php" -exec rm {} \;
上传目录必须禁止执行PHP:
location ~* ^/uploads/.*\.php$ {
deny all;
}
3 特殊文件保护
chattr +i /www/wwwroot/你的站点目录/safe.md chattr +i /www/wwwroot/你的站点目录/include/common.inc.php
chattr +i使文件变为不可修改,管理员也无法更改。
第四步:整站搬家——比重建快十倍
1 打包文件
cd /www/wwwroot tar -czf 站点备份_2024.tar.gz 你的站点目录
2 数据库全量导出
mysqldump -u数据库用户名 -p数据库密码 数据库名 > 数据库备份_2024.sql
3 迁移到新服务器
scp 站点备份_2024.tar.gz root@新服务器IP:/www/wwwroot/ scp 数据库备份_2024.sql root@新服务器IP:/tmp/
4 新服务器上解压并导入
tar -xzf 站点备份_2024.tar.gz mysql -u新数据库用户名 -p新数据库密码 数据库名 < /tmp/数据库备份_2024.sql
5 修改配置文件
编辑/www/wwwroot/你的站点目录/data/common.inc.php,更新:
$cfg_dbhost = 'localhost'; // 新数据库地址 $cfg_dbname = '新数据库名'; $cfg_dbuser = '新数据库用户'; $cfg_dbpwd = '新数据库密码'; $cfg_dbprefix = 'dede_';
第五步:域名更换后数据替换——别漏掉任何一处
1 数据库全库替换
UPDATE `dede_archives` SET `url`=REPLACE(`url`, '旧域名.com', '新域名.com'); UPDATE `dede_addonarticle` SET `body`=REPLACE(`body`, '旧域名.com', '新域名.com'); UPDATE `dede_arctype` SET `typedir`=REPLACE(`typedir`, '旧域名.com', '新域名.com'); UPDATE `dede_homepageset` SET `templet`=REPLACE(`templet`, '旧域名.com', '新域名.com'); UPDATE `dede_sysconfig` SET `value`=REPLACE(`value`, '旧域名.com', '新域名.com');
2 模板文件批量替换
find /www/wwwroot/你的站点目录/templets -type f -name "*.htm" -exec sed -i 's/旧域名.com/新域名.com/g' {} \;
3 绝对路径修复
检查include和plus目录下的PHP文件,可能硬编码了绝对路径:
grep -r "旧域名.com" /www/wwwroot/你的站点目录/include/ grep -r "旧域名.com" /www/wwwroot/你的站点目录/plus/
第六步:数据库备份与恢复——保命符
1 自动化备份脚本
创建/root/db_backup.sh:
#!/bin/bash DATE=$(date +%Y%m%d%H%M) mysqldump -u用户名 -p密码 数据库名 | gzip > /backup/db_$DATE.sql.gz find /backup/ -type f -mtime +30 -delete
加入crontab:每天凌晨2点执行:
0 2 * * * /bin/bash /root/db_backup.sh
2 恢复操作
gunzip < /backup/db_20241201.sql.gz | mysql -u用户名 -p密码 数据库名
3 增量备份(可选)
使用mysqlbinlog记录操作日志:
mysqlbinlog --start-datetime="2024-12-01 00:00:00" /var/log/mysql/binlog.000001 > incremental.sql
最后一步:验证手动生成功能
完成上述所有操作后,执行:
- 清理织梦缓存:
rm -rf /www/wwwroot/你的站点目录/data/cache/* - 登录后台,点击“生成”——“一键更新所有”
- 查看
/www/wwwroot/你的站点目录/index.html是否正常生成 - 浏览器访问,确认页面可正常加载
如果依然失败,检查Nginx或Apache的错误日志:
tail -100 /var/log/nginx/error.log
常见原因是PHP执行内存不足(在php.ini中增大memory_limit)、文件权限未正确设置、或核心文件仍然留有后门。
织梦CMS手动生成失败不是世界末日,它更像一个警报,提醒你该给站点做一次彻底的安全体检,按照上述步骤操作,不仅能恢复生成功能,更能让站点的安全等级上一个台阶,安全不是一次性的工作,而是持续运维的习惯。



发表评论