在Discuz系统中为找回密码页面增加验证码功能是可行的,可以通过以下两种方案实现:
方案一:直接修改核心文件(适合快速部署)
1. 模板文件修改:
打开模板文件 template/default/member/lostpasswd.htm
在邮箱输入框上方添加:
- <tr>
- <th>{lang secqaa}</th>
- <td><span class="secqaa">{secqaa}</span></td>
- </tr>
- <tr>
- <th>{lang answer}</th>
- <td><input type="text" name="secanswer" class="txt" /></td>
- </tr>
复制代码
2. 逻辑文件修改:
打开 source/module/member/member_lostpasswd.php
在提交处理代码前(约第43行)添加验证:
- if(!submitcheck('lostpwsubmit', 0, $seccodecheck, $secqaacheck)) {
- showmessage('security_question_invalid');
- }
复制代码
方案二:通过插件机制实现(推荐方式)
1. 创建插件目录结构:
- dzx_security/
- ├── discuz_plugin_dzx_security.xml
- └── source/
- └── plugin/
- └── dzx_security/
- ├── lostpasswd.class.php
- └── template/
- └── hook.htm
复制代码
2. 使用模板嵌入钩子:
在hook.htm中添加:
- <!--{hook/global_seccode}-->
- <!--{hook/global_secqaa}-->
复制代码
3. 实现验证逻辑:
在lostpasswd.class.php中:
- class plugin_dzx_security extends discuz_plugin {
- public function common() {
- global $_G;
- $_G['setting']['seccodedata']['lostpassword'] = 1; // 强制启用验证码
- $_G['setting']['secqaastatus'] = 1; // 强制启用验证问答
- }
- public function before_lostpasswd() {
- $secverify = $_GET['secverify'] ?? '';
- if(!check_seccode($secverify, $_GET['sechash'])) {
- showmessage('invalid_seccode');
- }
- loaducenter();
- uc_user_check_answer($_GET['secanswer'], $_GET['sechash']);
- }
- }
复制代码
技术要点说明:
1. 验证机制选择:
- 普通验证码:使用{seccode}模板变量
- 滑动验证:需启用云验证服务
- 验证问答:需同时修改问题库(后台→全局→安全验证→验证问答设置)
2. 安全增强建议:
- 在后台设置中启用"强制验证设置" → 选择"找回密码"操作
- 建议配合启用「登录失败限制」功能(全局→安全设置→防灌水设置)
- 可增加邮件发送频率限制(修改source/function/function_mail.php)
3. 防机器策略:
- // 在发送邮件前增加频率检查
- $count = C::t('common_failedlogin')->count_by_ip($_G['clientip']);
- if($count > 3) {
- showmessage('request_too_frequent');
- }
复制代码
注意事项:
1. 修改核心文件前务必做好备份
2. 验证问答需要设置有效的问题库
3. 如果使用滑动验证需确保服务器时间准确
4. 建议同时启用HTTPS保障验证数据传输安全
效果验证方法:
1. 清除浏览器缓存后测试流程
2. 使用测试工具模拟高频请求
3. 检查系统日志中的安全记录
如需更详细的实现方案或遇到具体技术问题,建议参考DZ插件网(www.dz-x.net)提供的《Discuz!X安全加固指南》,其中包含20种常见安全防护方案的实现细节。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。 |