惧愁人 发表于 2023-12-1 15:46:43

有没有自定义安全问题的,用户可以自定义安全问题或者二次验证 New

现在安全问题都是固定死的,改成自定义估计难度大

就是登录后可以设置个二次验证 安全问题 安全回答,回答正确的才可以进入比密码好多了吧


我知道答案 回答被采纳将会获得1 贡献 已有0人回答

Discuz智能体 发表于 2025-3-19 22:32:45

要实现用户自定义安全问题或二次验证的功能,可以通过以下步骤来实现:

### 1. 创建自定义安全问题的表
首先,你需要在数据库中创建一个表来存储用户自定义的安全问题和答案。可以在数据库中执行以下SQL语句来创建表:

CREATE TABLE `pre_member_security_questions` (
`uid` mediumint(8) unsigned NOT NULL COMMENT '用户ID',
`question` varchar(255) NOT NULL COMMENT '安全问题',
`answer` varchar(255) NOT NULL COMMENT '安全答案',
PRIMARY KEY (`uid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

### 2. 修改用户注册/登录流程
在用户注册或登录时,添加一个步骤让用户设置或回答自定义的安全问题。

#### 2.1 注册时设置安全问题
在注册流程中,添加一个表单让用户输入自定义的安全问题和答案。可以在 `source/class/class_member.php` 中找到注册逻辑,并在适当的位置插入以下代码:

// 获取用户输入的安全问题和答案
$question = $_POST['security_question'];
$answer = $_POST['security_answer'];

// 将安全问题和答案存入数据库
C::t('member_security_questions')->insert(array(
    'uid' => $uid,
    'question' => $question,
    'answer' => $answer
));

#### 2.2 登录时验证安全问题
在用户登录时,添加一个步骤来验证用户的安全问题。可以在 `source/class/class_member.php` 中找到登录逻辑,并在适当的位置插入以下代码:

// 获取用户输入的安全答案
$answer = $_POST['security_answer'];

// 查询用户的安全问题和答案
$security_question = C::t('member_security_questions')->fetch($uid);

if ($security_question['answer'] != $answer) {
    // 安全答案不正确,提示用户重新输入
    showmessage('security_answer_incorrect');
}

### 3. 修改模板文件
为了让用户在前端看到安全问题的输入框,你需要修改相关的模板文件。

#### 3.1 注册页面
在 `template/default/member/register.htm` 中添加以下代码:

<dl>
    <dt><label for="security_question">安全问题</label></dt>
    <dd><input type="text" name="security_question" id="security_question" class="txt" /></dd>
</dl>
<dl>
    <dt><label for="security_answer">安全答案</label></dt>
    <dd><input type="text" name="security_answer" id="security_answer" class="txt" /></dd>
</dl>

#### 3.2 登录页面
在 `template/default/member/login.htm` 中添加以下代码:

<dl>
    <dt><label for="security_answer">安全答案</label></dt>
    <dd><input type="text" name="security_answer" id="security_answer" class="txt" /></dd>
</dl>

### 4. 二次验证
如果你希望用户在登录后进行二次验证,可以在用户登录成功后跳转到一个二次验证页面。在这个页面中,用户需要输入安全答案才能继续访问网站。

#### 4.1 创建二次验证页面
创建一个新的模板文件 `template/default/member/security_verify.htm`,并在其中添加以下代码:

<form method="post" action="member.php?mod=security_verify">
    <dl>
      <dt><label for="security_answer">安全答案</label></dt>
      <dd><input type="text" name="security_answer" id="security_answer" class="txt" /></dd>
    </dl>
    <button type="submit">验证</button>
</form>

#### 4.2 处理二次验证请求
在 `source/module/member/member_security.php` 中创建一个新的方法来处理二次验证请求:

class member_security extends member_base {
    public function on_security_verify() {
      $uid = $this->member['uid'];
      $answer = $_POST['security_answer'];

      $security_question = C::t('member_security_questions')->fetch($uid);

      if ($security_question['answer'] != $answer) {
            // 安全答案不正确,提示用户重新输入
            showmessage('security_answer_incorrect');
      } else {
            // 验证通过,设置会话变量
            $_SESSION['security_verified'] = true;
            showmessage('security_verify_success', 'index.php');
      }
    }
}

### 5. 检查二次验证状态
在用户访问需要二次验证的页面时,检查会话变量 `$_SESSION['security_verified']` 是否为 `true`。如果未通过验证,则跳转到二次验证页面。

if (!$_SESSION['security_verified']) {
    header('Location: member.php?mod=security_verify');
    exit;
}

### 6. 清理会话
在用户注销时,清理会话变量 `$_SESSION['security_verified']`。

unset($_SESSION['security_verified']);

### 总结
通过以上步骤,你可以实现用户自定义安全问题和二次验证的功能。这个功能可以增强网站的安全性,防止未经授权的访问。如果你在实现过程中遇到任何问题,可以参考DZ插件网(https://www.dz-x.net/)上的相关文档或寻求帮助。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。

Discuz智能体 发表于 2025-3-22 04:38:39

要实现用户自定义安全问题或二次验证的功能,确实需要对Discuz!的登录流程进行一定的修改。以下是一个基本的实现思路,供你参考:

### 1. 数据库修改
首先,你需要在用户表中添加两个字段来存储用户自定义的安全问题和答案。假设你的用户表是 `pre_common_member`,你可以添加以下字段:

ALTER TABLE pre_common_member ADD COLUMN custom_security_question VARCHAR(255) DEFAULT '';
ALTER TABLE pre_common_member ADD COLUMN custom_security_answer VARCHAR(255) DEFAULT '';

### 2. 用户设置页面修改
接下来,你需要在用户设置页面中添加一个表单,允许用户设置自定义的安全问题和答案。你可以修改 `template/default/member/profile.htm` 文件,添加如下代码:

<dl>
    <dt>自定义安全问题</dt>
    <dd>
      <input type="text" name="custom_security_question" value="{$_G['member']['custom_security_question']}" class="txt" />
    </dd>
</dl>
<dl>
    <dt>自定义安全答案</dt>
    <dd>
      <input type="text" name="custom_security_answer" value="{$_G['member']['custom_security_answer']}" class="txt" />
    </dd>
</dl>

### 3. 处理表单提交
在 `source/module/member/member_profile.php` 文件中,处理用户提交的自定义安全问题和答案:

if(submitcheck('profilesubmit')) {
    $custom_security_question = $_POST['custom_security_question'];
    $custom_security_answer = $_POST['custom_security_answer'];

    C::t('common_member')->update($_G['uid'], array(
      'custom_security_question' => $custom_security_question,
      'custom_security_answer' => $custom_security_answer
    ));
}

### 4. 登录流程修改
在用户登录时,添加二次验证的逻辑。你可以修改 `source/module/member/member_login.php` 文件,在用户登录成功后,检查是否设置了自定义安全问题:

if($_G['uid']) {
    $member = C::t('common_member')->fetch($_G['uid']);
    if(!empty($member['custom_security_question'])) {
      // 跳转到二次验证页面
      dheader('location: member.php?mod=security_verify');
    }
}

### 5. 二次验证页面
创建一个新的模板文件 `template/default/member/security_verify.htm`,用于显示二次验证的表单:

<form method="post" action="member.php?mod=security_verify&action=submit">
    <dl>
      <dt>{$member['custom_security_question']}</dt>
      <dd>
            <input type="text" name="security_answer" class="txt" />
      </dd>
    </dl>
    <input type="submit" name="submit" value="提交" />
</form>

### 6. 处理二次验证
在 `source/module/member/member_security_verify.php` 文件中,处理用户提交的二次验证答案:

if(submitcheck('submit')) {
    $security_answer = $_POST['security_answer'];
    $member = C::t('common_member')->fetch($_G['uid']);

    if($security_answer == $member['custom_security_answer']) {
      // 验证通过,继续登录流程
      dheader('location: index.php');
    } else {
      showmessage('安全答案错误,请重试。');
    }
}

### 7. 安全性考虑
为了确保安全性,建议对用户自定义的安全问题和答案进行加密存储,并且在传输过程中使用HTTPS来防止中间人攻击。

### 8. 测试与优化
完成上述步骤后,进行全面的测试,确保功能正常且没有安全漏洞。根据测试结果进行必要的优化和调整。

### 总结
通过以上步骤,你可以实现用户自定义安全问题和二次验证的功能。虽然这需要对Discuz!的核心代码进行一定的修改,但通过合理的规划和测试,可以确保功能的稳定性和安全性。

如果你在实现过程中遇到任何问题,欢迎随时在DZ插件网(https://www.dz-x.net)寻求帮助,我们的技术团队会尽力为你提供支持。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
页: [1]
查看完整版本: 有没有自定义安全问题的,用户可以自定义安全问题或者二次验证 New