WordPress后台强密码强制规则及密码复用限制需求
嘿,这就给你一套完全满足需求的WordPress强密码强制方案,我在多个企业级WP项目里都用过这套逻辑,稳定性拉满:
WordPress后台强密码全规则实现方案
1. 密码复杂度强制校验
不管是创建新用户、重置密码还是用户自行修改密码,都要强制符合你要求的复杂度:至少12位,包含大写字母、小写字母、数字、特殊字符。
把下面的代码加到你的主题functions.php文件,或者更稳妥的方式是创建一个自定义插件来放这些代码(避免主题更新丢失):
add_action('validate_password_reset', 'wp_strong_password_validation', 10, 2); add_action('user_profile_update_errors', 'wp_strong_password_validation_profile', 10, 3); add_action('register_post', 'wp_strong_password_validation_register', 10, 3); // 重置密码时校验 function wp_strong_password_validation($errors, $user_data) { wp_check_strong_password($errors); } // 个人资料修改密码时校验 function wp_strong_password_validation_profile($errors, $update, $user) { if (!empty($_POST['pass1'])) { wp_check_strong_password($errors, $_POST['pass1']); } } // 注册新用户时校验 function wp_strong_password_validation_register($sanitized_user_login, $user_email, $errors) { if (!empty($_POST['pass1'])) { wp_check_strong_password($errors, $_POST['pass1']); } } // 核心校验逻辑 function wp_check_strong_password(&$errors, $password = '') { if (empty($password)) { return; } // 密码规则:至少12位,包含大小写、数字、特殊字符 $pattern = '/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{12,}$/'; if (!preg_match($pattern, $password)) { $errors->add('weak_password', __('错误:密码必须至少12位,且包含至少一个大写字母、一个小写字母、一个数字和一个特殊字符(@$!%*?&)', 'text-domain')); } }
2. 密码过期时间限制
管理员每45天必须改密码,普通用户90天。这里需要记录用户上次修改密码的时间,然后在登录时校验:
// 注册/修改密码时记录时间 add_action('user_register', 'wp_set_password_last_changed'); add_action('password_reset', 'wp_set_password_last_changed'); add_action('profile_update', 'wp_set_password_last_changed_on_profile'); function wp_set_password_last_changed($user_id) { update_user_meta($user_id, 'last_password_change', current_time('timestamp')); } function wp_set_password_last_changed_on_profile($user_id) { if (!empty($_POST['pass1']) && $_POST['pass1'] === $_POST['pass2']) { update_user_meta($user_id, 'last_password_change', current_time('timestamp')); } } // 登录时校验密码过期 add_action('wp_authenticate', 'wp_check_password_expiration', 10, 2); function wp_check_password_expiration($user_login, $user) { if (!is_a($user, 'WP_User')) { return; } $last_change = get_user_meta($user->ID, 'last_password_change', true); if (!$last_change) { // 老用户没有记录,默认设置当前时间 $last_change = current_time('timestamp'); update_user_meta($user->ID, 'last_password_change', $last_change); } // 区分管理员和普通用户的过期天数 $expire_days = in_array('administrator', $user->roles) ? 45 : 90; $expire_timestamp = $last_change + ($expire_days * DAY_IN_SECONDS); if (current_time('timestamp') > $expire_timestamp) { // 强制跳转到修改密码页面 wp_redirect(wp_get_referer() ? wp_get_referer() : admin_url('profile.php')); wp_die('<strong>密码已过期</strong>:请立即修改你的密码以继续使用。', '密码过期', array('response' => 403)); } }
3. 密码历史限制(防止复用)
我们需要保存用户最近5次的密码哈希,修改密码时对比新密码是否和历史重复:
// 修改密码前检查历史 add_action('check_passwords', 'wp_check_password_history', 10, 3); function wp_check_password_history($user_login, $password1, $password2) { if ($password1 !== $password2) { return; } $user = get_user_by('login', $user_login); if (!$user) { return; } // 获取历史密码哈希(最多保存5条) $password_history = get_user_meta($user->ID, 'password_history', true); $password_history = is_array($password_history) ? $password_history : array(); // 检查新密码是否和历史重复 foreach ($password_history as $old_hash) { if (wp_check_password($password1, $old_hash, $user->ID)) { wp_die('<strong>错误</strong>:不能使用最近用过的密码,请更换新密码。'); } } } // 修改密码后更新历史记录 add_action('password_reset', 'wp_update_password_history'); add_action('profile_update', 'wp_update_password_history_on_profile'); function wp_update_password_history($user) { $user_id = is_object($user) ? $user->ID : $user; wp_save_password_to_history($user_id); } function wp_update_password_history_on_profile($user_id) { if (!empty($_POST['pass1']) && $_POST['pass1'] === $_POST['pass2']) { wp_save_password_to_history($user_id); } } function wp_save_password_to_history($user_id) { $user = get_user_by('id', $user_id); if (!$user) { return; } $password_history = get_user_meta($user_id, 'password_history', true); $password_history = is_array($password_history) ? $password_history : array(); // 添加当前密码哈希到历史 array_unshift($password_history, $user->user_pass); // 只保留最近5条 if (count($password_history) > 5) { array_pop($password_history); } update_user_meta($user_id, 'password_history', $password_history); }
注意事项
- 建议把这些代码放到自定义插件里,而不是主题的
functions.php,这样主题更新时不会丢失代码。 - 可以根据需求调整密码历史保存的条数(上面是5条),或者修改特殊字符的范围。
- 所有的提示文字可以根据你的网站语言修改,替换
__()函数里的内容即可。
内容的提问来源于stack exchange,提问作者Samuel
相关产品推荐
相关产品推荐

