如何阻止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', '不能使用当前密码,请选择一个新密码。'); } }
这段代码会在用户提交重置密码表单时,直接检查新密码是否和当前密码匹配,如果匹配就添加错误提示,页面不会跳转,而是停在重置表单页显示错误信息,完全符合需求。
进阶:阻止使用历史旧密码
如果需要阻止用户复用最近使用过的旧密码,你需要先存储用户的历史密码哈希,然后在验证时逐个对比:
- 首先,在密码更新成功后,保存历史密码哈希到用户元数据:
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); }
- 然后在验证阶段,检查新密码是否匹配历史密码:
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
相关产品推荐
相关产品推荐

