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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:46:52