You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何阻止WordPress站点用户重置密码为已使用过的密码?

解决WordPress阻止重复使用当前/旧密码的问题

你的代码核心问题是用错了钩子:password_reset是在密码已经成功重置完成后才触发的,这时候密码已经更新到数据库,页面跳转也已经触发,再用JS添加提示完全起不到阻止作用。

修正方案:在密码重置验证阶段拦截

我们需要用validate_password_reset钩子,这个钩子在重置密码表单提交后、密码更新前触发,可以直接添加错误信息并阻止后续流程。

阻止使用当前密码的代码

add_action('validate_password_reset', 'prevent_reuse_current_password', 10, 2);
function prevent_reuse_current_password($errors, $user) {
    // 获取用户输入的新密码
    $new_password = $_POST['pass1'];
    
    // 验证新密码是否和当前密码一致
    if (wp_check_password($new_password, $user->user_pass, $user->ID)) {
        $errors->add('password_reuse', '不能使用当前密码,请选择一个新密码。');
    }
}

这段代码会在用户提交重置密码表单时,直接检查新密码是否和当前密码匹配,如果匹配就添加错误提示,页面不会跳转,而是停在重置表单页显示错误信息,完全符合需求。

进阶:阻止使用历史旧密码

如果需要阻止用户复用最近使用过的旧密码,你需要先存储用户的历史密码哈希,然后在验证时逐个对比:

  1. 首先,在密码更新成功后,保存历史密码哈希到用户元数据:
add_action('password_reset', 'save_password_history', 10, 2);
function save_password_history($user, $new_pass) {
    // 保存最近3个密码哈希,可以自行调整数量
    $history_count = 3;
    
    // 获取已有的历史密码
    $password_history = get_user_meta($user->ID, '_password_history', true);
    if (!is_array($password_history)) {
        $password_history = [];
    }
    
    // 把当前新密码的哈希加入历史(注意:这里不用自己哈希,直接用user_pass的最新值)
    array_unshift($password_history, $user->user_pass);
    
    // 只保留最近的N个密码
    $password_history = array_slice($password_history, 0, $history_count);
    
    // 更新用户元数据
    update_user_meta($user->ID, '_password_history', $password_history);
}
  1. 然后在验证阶段,检查新密码是否匹配历史密码:
add_action('validate_password_reset', 'prevent_reuse_old_passwords', 10, 2);
function prevent_reuse_old_passwords($errors, $user) {
    $new_password = $_POST['pass1'];
    $password_history = get_user_meta($user->ID, '_password_history', true);
    
    if (is_array($password_history)) {
        foreach ($password_history as $old_hash) {
            if (wp_check_password($new_password, $old_hash, $user->ID)) {
                $errors->add('password_reuse_old', '不能使用曾经用过的密码,请选择一个新密码。');
                break;
            }
        }
    }
}

注意事项

  • 不需要手动引入class-phpass.php,WordPress的wp_check_password()函数已经封装了密码验证逻辑,直接用更安全可靠。
  • 错误信息会自动显示在重置密码表单的顶部,不需要用JS手动添加,符合WordPress的原生错误提示风格。

内容的提问来源于stack exchange,提问作者Currie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 07:05:20