WordPress ユーザー登録やコメントフォームのスパム対策例

これ書いちゃうと対策されるかもしれませんが、昔からこっそりやってるスパム対策です。
スパムは入力できる項目は、ほぼ全ての項目に何か入れて送ってきます。そこでCSSで隠した項目にデーターが入っていればスパムと判定してerrorを表示するようにします。

WordPressではデフォルトでは「ユーザー登録」は OFFになってますが、設定 -> 一般 の メンバーシップで「だれでもユーザー登録ができるようにする 」にチェックを入れていると「ユーザー登録」ができるようになります。
この「ユーザー登録」や 「コメント」でのスパム対策例をご紹介します。

 

ユーザー登録の場合

ユーザー登録フォームに ダミー項目「URL」を追加します。
ダミー項目「URL」を CSSで非表示にします。これでユーザーには見えません。
しかし スパム側では見えている状態なので 何かデーターを入れてきます。
という事でもし、ダミー項目「URL」にデーターが入っていれば、スパム! と言う事になります。

わかりやすいように「URL」を見えるようにしたテストです。
spam_4
*URLに何かデータを入れて送信するとエラーになります。

以下のコードを my-plugin.php に張り付けてください。

/* 
 * ユーザー登録
 * ダミー項目「URL」を追加してスパム判定をする。
 *
 * License: GPLv2 or later
 */
function nendebcom_spam_register_field() {
	?>
	<p style="display:none">
		<label><?php _e( 'URL' ) ?><br />
		<input type="text" name="user_proof_url" id="user_proof_url" class="input" size="25" tabindex="30" /></label>
	</p>
	<?php
}
add_action( 'register_form', 'nendebcom_spam_register_field' );

//register field validate
function nendebcom_spam_register_field_validate( $sanitized_user_login, $user_email, $errors ) {
	if ( !empty( $_POST[ 'user_proof_url' ] ) ) {
		return $errors->add( 'proofempty', '<strong>ERROR</strong>' );
	}
}
add_action( 'register_post', 'nendebcom_spam_register_field_validate', 10, 3 );

 

コメント投稿の場合

コメント投稿フォームに ダミー項目「URL」を追加します。
ダミー項目「URL」を CSSで非表示にします。
これでユーザーには見えませんので ダミー項目「URL」にデーターが入っていれば、スパム と言う事になります。
spam_3
わかりやすいように「URL」を見えるようにしたテストです。
spam_2
*URLに何かデータを入れて送信するとエラーになります。
spam_1

以下のコードを my-plugin.php に張り付けてください。

/* 
 * コメント投稿
 * ダミー項目「URL」を追加してスパム判定をする。
 *
 * License: GPLv2 or later
 */
function nendebcom_spam_comment_field() {
	?>
	<p class="comment-form-url" style="display:none">
		<label><?php _e( 'URL' ) ?><span class="required">*</span></label>
		<input type="text" name="comment_url" id="comment_url" class="input" size="30" />
	</p>
	<?php
}
add_action( 'comment_form_after_fields', 'nendebcom_spam_comment_field' );

//comment field validate
function nendebcom_spam_comment_validate( $comment_post_ID ) {
	$comment_url = isset( $_POST[ 'comment_url' ] ) ? $_POST[ 'comment_url' ] : '';
	if ( $comment_url != '' ) {
		wp_die( 'ERROR' );
	}
}
add_action( 'pre_comment_on_post', 'nendebcom_spam_comment_validate' );

 

* 実際に、display:none を無しにして「URL」項目を入れたり、空欄にして送ったりしてテストしてみてください。
* 既に「URL」の「user_proof_url」項目を使ってる場合は他の項目名に変更してください。
* ここでは style=”display:none” としてますが、別にclass設定して style.css 等に記述した方がいいと思います。
* 不動産会員プラグインも既にこの対策をしていますので利用中の方は不要です。

参考

WordPress Codex Plugin API/Action Reference/register post
https://codex.wordpress.org/Plugin_API/Action_Reference/register_post

WordPress Codex Plugin API/Action Reference/register form
https://codex.wordpress.org/Plugin_API/Action_Reference/register_form