2026年5月20日
2026年5月20日
WordPressのスパムアカウント登録を防ぐ方法
はじめに
WordPressのユーザー登録が開放されていると、ボットが大量のスパムアカウントを自動登録する場合があります。スパムアカウントはサイトのリソースを消費し、不正コメント・スパムフォーラム投稿・ブルートフォース攻撃の足がかりになります。
症状・原因
- ユーザー一覧に見知らぬメールアドレスのアカウントが大量に登録されている
mailinator.com・guerrillamail.com等の使い捨てメールアドレスで登録されている- ダッシュボードに毎日大量の新規ユーザー通知が届いている
- 登録直後にスパムコメントを投稿するアカウントが増えている
解決手順
ステップ1:現在のスパムアカウントを確認・削除する
# 最近登録されたユーザーを確認
wp user list --fields=ID,user_login,user_email,user_registered --orderby=registered --order=DESC --format=table | head -30
# 使い捨てメールドメインのユーザーを検索
wp user list --fields=ID,user_email --format=csv | \
grep -E "mailinator|guerrillamail|tempmail|throwaway|yopmail|sharklasers"
# 特定ドメインのユーザーを一括削除
wp eval "
\$spam_domains = ['mailinator.com', 'guerrillamail.com', 'tempmail.com', 'yopmail.com'];
\$users = get_users(['fields' => ['ID', 'user_email']]);
\$deleted = 0;
foreach (\$users as \$user) {
\$domain = substr(strrchr(\$user->user_email, '@'), 1);
if (in_array(\$domain, \$spam_domains, true)) {
wp_delete_user(\$user->ID, 1); // 投稿は管理者(ID=1)に再割り当て
\$deleted++;
}
}
echo \"Deleted: {\$deleted} spam users\" . PHP_EOL;
"
ステップ2:登録フォームに honeypot を追加する
// functions.php: 登録フォームに honeypot でボットをトラップ
// ① honeypot フィールドを追加
add_action('register_form', function(): void {
echo '<p style="display:none!important" aria-hidden="true">';
echo '<label for="hp_email2">Confirm Email (leave blank)</label>';
echo '<input type="text" name="hp_email2" id="hp_email2" value="" tabindex="-1" autocomplete="off">';
echo '</p>';
// タイムスタンプも追加(高速送信はボット)
echo '<input type="hidden" name="reg_timestamp" value="' . time() . '">';
});
// ② 登録時に honeypot を検証
add_filter('registration_errors', function(\WP_Error $errors, string $sanitized_user_login, string $user_email): \WP_Error {
// honeypot フィールドが入力されていたらエラー
if (!empty($_POST['hp_email2'])) {
$errors->add('spam_detected', 'スパムとして検出されました。');
return $errors;
}
// タイムスタンプ検証(5秒未満での登録はボット)
$timestamp = (int) ($_POST['reg_timestamp'] ?? 0);
if ($timestamp > 0 && (time() - $timestamp) < 5) {
$errors->add('too_fast', '少し時間を置いてから再度お試しください。');
}
return $errors;
}, 10, 3);
ステップ3:使い捨てメールドメインをブロックする
// functions.php: 使い捨てメールアドレスのブロック
add_filter('registration_errors', function(\WP_Error $errors, string $login, string $email): \WP_Error {
// 使い捨てメールドメインのリスト
$blocked_domains = [
'mailinator.com', 'guerrillamail.com', 'tempmail.com',
'throwam.com', 'yopmail.com', 'sharklasers.com',
'guerrillamailblock.com', 'grr.la', 'spam4.me',
'trashmail.com', 'dispostable.com', 'mailnull.com',
];
$domain = strtolower(substr(strrchr($email, '@'), 1));
if (in_array($domain, $blocked_domains, true)) {
$errors->add('invalid_email_domain', '使用できないメールアドレスです。別のメールアドレスをご使用ください。');
}
// メールアドレスのMXレコードを確認(送信可能なドメインか)
if (!getmxrr($domain, $mxhosts)) {
$errors->add('invalid_email_domain', '存在しないメールドメインです。');
}
return $errors;
}, 10, 3);
ステップ4:管理者承認制にする
// functions.php: 新規ユーザー登録を管理者承認制にする
// ① 登録完了後にユーザーを無効化(管理者が承認するまでログイン不可)
add_action('user_register', function(int $user_id): void {
// ユーザーに「pending」メタを追加
update_user_meta($user_id, 'account_status', 'pending');
// 管理者に通知メールを送信
$user = get_userdata($user_id);
$approve_url = add_query_arg([
'action' => 'approve_user',
'user_id' => $user_id,
'nonce' => wp_create_nonce('approve_user_' . $user_id),
], admin_url('users.php'));
wp_mail(
get_option('admin_email'),
'新規ユーザー登録の承認が必要です: ' . $user->user_login,
"新規ユーザー: {$user->user_email}\n承認URL: {$approve_url}"
);
});
// ② ログイン時に承認済みか確認
add_filter('authenticate', function(mixed $user): mixed {
if (!($user instanceof \WP_User)) return $user;
$status = get_user_meta($user->ID, 'account_status', true);
if ($status === 'pending') {
return new \WP_Error('account_pending', 'アカウントは管理者の承認待ちです。');
}
return $user;
}, 30);
ステップ5:登録を制限・完全に無効化する
// functions.php: 登録を厳しく制限
// ① 特定の時間帯のみ登録を許可
add_filter('registration_errors', function(\WP_Error $errors): \WP_Error {
$hour = (int) current_time('G');
// 深夜(0〜5時)の登録をブロック(ボットが活発な時間帯)
if ($hour >= 0 && $hour < 5) {
$errors->add('registration_closed', '現在登録を受け付けていません。後ほどお試しください。');
}
return $errors;
});
// ② 登録を完全に無効化(招待制にする場合)
// WordPress 設定 → 一般 → 「だれでもユーザー登録ができるようにする」のチェックを外す
// または wp-config.php で:
// define('DISALLOW_UNFILTERED_HTML', true);
// WP-CLI で設定
// wp option update users_can_register 0
# 登録を完全に無効化
wp option update users_can_register 0
# 現在の設定を確認
wp option get users_can_register
# 0 → 登録不可 / 1 → 登録可能
# 既存スパムユーザーを一括確認
wp user list --role=subscriber --fields=ID,user_email,user_registered --format=table | wc -l
注意事項
- MXレコード確認(
getmxrr())はDNSルックアップを行うため、登録処理が遅くなる場合があります。タイムアウト設定を確認し、高トラフィックなサイトでは外部APIサービスの使用を検討してください - 管理者承認制は正当なユーザーの登録体験を損ないます。承認通知メールのタイムアウトを設けるか、自動承認の条件(企業メールドメイン等)を設定することを推奨します
- reCAPTCHA(Google)を使用する場合はプライバシーポリシーへの記載が必要です。プラグイン「WP Cerber Security」や「WPForms」には組み込みのCAPTCHA機能があります
まとめ
スパムアカウント防止は①wp user list --orderby=registeredで最近の登録を確認・スパムドメインを削除、②登録フォームにhoneypotフィールドとタイムスタンプを追加、③registration_errorsフィルターで使い捨てメールドメインをブロック、④user_registerフックで管理者承認制を実装、⑤不要な場合はwp option update users_can_register 0で登録を完全無効化します。