WordPressを使ったサイトでユーザー登録を可能にしているサイトもちらほらと見かけるようになりました。個人的にはあんまり運営経験無いんですが、サービスとスパムは切っても切れない問題ですよね。そこで一つ、簡単な方法でスパムユーザーの登録を防ぐ方法をメモしておきます。

とはいえ、最近はOAuth認証を使ったTwitterやFacebookによるユーザー登録のほうが目立つ印象ですが、所詮ソーシャル界隈で便利というだけの依存的なものに過ぎませんので有効な解決策とはいえません。

API等に頼らない、非依存型のスパム対策という選択肢もあることがやはり望ましいかと思います。

実装


これはユーザー登録画面です。通常はメールアドレスとユーザー名しか項目がありませんが、このようにヒューマンチェック用に項目が追加されており、キーワードに当てはまらないと登録出来ないようになっています。

答えは日本語で

この場合、誰でも分かる答えである必要がありますので、例えば「このサイトのドメインは?」とか「サイト名は?」とか、うまく考えてみてください。

よくある足し算みたいなやつでもいいかもですけど、ターゲットが日本人オンリーなら回答は日本語のほうが確実っぽいです。

ではコードです。

コード

functions.phpに追記します。

add_action( 'register_form', 'add_register_field' );
function add_register_field() { ?>
    <p>
        <label><?php _e('ここに質問内容') ?><br />
        <input type="text" name="user_proof" id="user_proof" class="input" size="25" tabindex="20" /></label>
    </p>
<?php }
 
add_action( 'register_post', 'add_register_field_validate', 10, 3 );
function add_register_field_validate( $sanitized_user_login, $user_email, $errors) {
    if (!isset($_POST[ 'user_proof' ]) || empty($_POST[ 'user_proof' ])) {
        return $errors->add( 'proofempty', '<strong>ERROR</strong>: 質問に答えなかったときのエラー文章'  );
    } elseif ( strtolower( $_POST[ 'user_proof' ] ) != 'ここが回答。これにマッチしないとエラーが出る' ) {
        return $errors->add( 'prooffail', '<strong>ERROR</strong>: マッチしなかったときのエラー文章'  );
    }
}

ユーザー登録フォームにダミー的に項目を追加してバリデーションしてあげればいい、というアイデアです。空白でも答えが間違っていても登録通過しません。

シンプルでいいのでは。個人的にはあまり登録制のサイトを作る機会が無いのでどれだけスパムユーザーがいるか分かりませんけど、たまにBuddyPressでスパムユーザーを見かけるので困ってる方もいるかなと思って記事にしました。

コードは以下を参考にしました。

via:WP Glee