根据你描述的问题现象,结合Discuz!的过滤词工作机制,我们从技术角度分析可能的原因和解决方案如下:
一、核心排查步骤:
1. 敏感词模式检查
- 通过数据库执行SQL查询(注意备份):
- SELECT * FROM pre_common_setting WHERE skey IN ('censoremail','censorusername','censorpost');
复制代码
确认:
- `censorpost`的status字段是否为1(启用状态)
- `modtype`字段值是否为2(审核模式)
2. 缓存更新检测
在网站后台执行:
【后台】->【工具】->【更新缓存】,勾选「模板缓存」和「数据缓存」后更新
3. 冲突检测方法
临时修改网站配置文件:
/config/config_global.php 末尾添加:
- $_config['plugindeveloper'] = 2;
- $_config['hookscript']['forum']['post'] = '';
复制代码
这会强制关闭所有插件钩子
二、高级诊断方案:
1. 流程追踪调试
修改以下文件添加日志记录:
/source/module/forum/forum_post.php
在约第680行(提交处理逻辑处)添加:
- $censored = censormod($message);
- if($censored) {
- require_once libfile('function/misc');
- $censormodmessage = getcensormod($censored);
- log_message('[CENSOR_DEBUG] '.var_export($censormodmessage, true), 'mod');
- }
复制代码
2. 数据库触发器监控(需MySQL 5.7+)
创建监控表:
- CREATE TABLE censor_log (
- id INT AUTO_INCREMENT PRIMARY KEY,
- log_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
- post_data TEXT,
- filter_result TEXT
- );
复制代码
创建触发器:
- DELIMITER $$
- CREATE TRIGGER trg_censor_check
- BEFORE INSERT ON pre_forum_post
- FOR EACH ROW
- BEGIN
- IF NEW.invisible = 2 THEN
- INSERT INTO censor_log(post_data, filter_result)
- VALUES (NEW.message, (SELECT value FROM pre_common_setting WHERE skey='censorpost'));
- END IF;
- END$$
- DELIMITER ;
复制代码
三、已知常见问题解决方案:
1. 混合过滤规则冲突
当同时存在以下规则时会引发异常:
- 全站级过滤(pre_common_setting)
- 板块级过滤(pre_forum_forum.censorwords字段)
- 用户组过滤(pre_common_usergroup.censorwords字段)
建议使用统一过滤层级,推荐仅保留全站级过滤规则
2. 特殊编码干扰
使用十六进制检测工具检查敏感词:
- // 检测示例
- $str = '敏感词测试';
- echo bin2hex($str)."\n";
- // 输出:e6958fe6849fe8af8de6b58be8af95
复制代码
3. 第三方插件干扰排查
在/source/plugin/目录下创建空文件:
- find . -name 'hook.class.php' -exec grep -l 'filter_modpost' {} \;
复制代码
该命令可列出所有涉及发帖过滤的插件
四、终极解决方案建议:
若仍无法定位问题,可采用模块替换法:
1. 备份原文件:
- cp -r source/module/forum/ source/module/forum_bak
复制代码
2. 从官方完整包提取以下文件覆盖:
- /source/module/forum/forum_post.php
- /source/class/helper/helper_censor.php
- /source/function/function_post.php
3. 清除opcode缓存:
- // 在网站根目录创建clean.php
- <?php
- if(function_exists('opcache_reset')) opcache_reset();
- if(function_exists('apc_clear_cache')) apc_clear_cache();
- echo "缓存已清除";
复制代码
通过以上技术方案,可系统性地定位和解决过滤词机制异常的问题。建议先进行非破坏性的日志记录式排查,再逐步进行模块替换。如果问题依然存在,可通过DZ插件网的技术支持通道提交调试日志。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。 |