2026年5月20日

2026年5月20日

WordPressのパスワード強度要件を設定する方法

はじめに

WordPressはデフォルトで弱いパスワードも設定できてしまいます。会員サイトやビジネスサイトでは、パスワードの最小文字数や複雑性要件を強制することでセキュリティを大幅に向上できます。

解決手順

ステップ1:ユーザー登録時のパスワード検証

// functions.php — 新規登録時のパスワード強度チェック
add_filter('registration_errors', function($errors, $sanitized_user_login, $user_email) {
    $password = $_POST['pass1'] ?? '';

    if (strlen($password) < 12) {
        $errors->add('weak_password', 'パスワードは12文字以上にしてください。');
    }
    if (!preg_match('/[A-Z]/', $password)) {
        $errors->add('weak_password', 'パスワードに大文字を1文字以上含めてください。');
    }
    if (!preg_match('/[a-z]/', $password)) {
        $errors->add('weak_password', 'パスワードに小文字を1文字以上含めてください。');
    }
    if (!preg_match('/[0-9]/', $password)) {
        $errors->add('weak_password', 'パスワードに数字を1文字以上含めてください。');
    }
    if (!preg_match('/[!@#$%^&*()_+\-=\[\]{};\':"\\|,.<>\/?]/', $password)) {
        $errors->add('weak_password', 'パスワードに記号を1文字以上含めてください。');
    }

    return $errors;
}, 10, 3);

ステップ2:プロフィール更新時のパスワード検証

// functions.php — プロフィール更新時のパスワード強度チェック
add_action('user_profile_update_errors', function($errors, $update, $user) {
    if (empty($_POST['pass1'])) {
        return; // パスワード変更なしの場合はスキップ
    }

    $password = $_POST['pass1'];

    if (strlen($password) < 12) {
        $errors->add('weak_password', 'パスワードは12文字以上にしてください。');
    }
    if (!preg_match('/[A-Z]/', $password)) {
        $errors->add('weak_password', 'パスワードに大文字を含めてください。');
    }
    if (!preg_match('/[0-9!@#$%]/', $password)) {
        $errors->add('weak_password', 'パスワードに数字または記号を含めてください。');
    }
}, 10, 3);

ステップ3:パスワード強度チェック関数を共通化する

// functions.php — バリデーション関数を共通化
function validate_password_strength(string $password): WP_Error {
    $errors = new WP_Error();
    if (strlen($password) < 12)                             $errors->add('length',    '12文字以上必要');
    if (!preg_match('/[A-Z]/', $password))                  $errors->add('uppercase', '大文字が必要');
    if (!preg_match('/[a-z]/', $password))                  $errors->add('lowercase', '小文字が必要');
    if (!preg_match('/[0-9]/', $password))                  $errors->add('digit',     '数字が必要');
    if (!preg_match('/[!@#$%^&*()\-_=+\[\]{}|;:,.<>?]/', $password))
                                                             $errors->add('symbol',    '記号が必要');
    return $errors;
}

ステップ4:WP-CLIで弱いパスワードのユーザーを確認

# 全ユーザーのパスワードを強制リセット(セキュリティインシデント後)
wp user list --field=ID | xargs -I {} wp user update {} --user_pass=$(openssl rand -base64 16)

# 特定ユーザーのパスワードを変更
wp user update username --user_pass='NewStr0ng!Pass#2024'

注意事項

  • $_POST['pass1'] は生のパスワード値にアクセスしています。XSS対策としてサニタイズ処理は行わないでください(ハッシュ化前の値が必要なため)
  • パスワードリセット後のパスワード変更には別途 validate_password_reset フックが必要です
  • 管理画面の「弱いパスワードを使用」ボタンを無効化するにはJavaScriptで対応が必要です(wp-login.js のフック)

まとめ

WordPressのパスワード強度ポリシーは registration_errorsuser_profile_update_errors フックで実装します。バリデーション関数を共通化しておくと、ログイン関連の複数のフックから再利用できます。

お気軽にご相談ください

お見積りへ お問い合わせへ