How to implement anti-spam measures using Honeypot in WordPress without plugins

WordPressでHoneypotを使ったコメントスパム対策をプラグインなしで実装する方法

公開日: サイト作成日記

WordPressはブログ+αのサイト運営ツールなので、ほとんどのテーマでは標準で投稿に対するコメント欄が出力されるようになっています(もちろん、WordPressの設定で、コメントを一切受け付けないようにすることもできます)。

せっかく書いた投稿だからできれば反応が欲しいということでコメント欄を出力するようにしていて困るのが、スパム行為。中にはちょっと・・というコメントもあるかも知れませんが、それは読む人それぞれの感想なので仕方ないこととしても、本当に困るのが英文で書かれた全く関係のないもの。

この種のコメントは、実際に手で入力して送信してくるものではなく、機械的にコメント欄を見つけて自動的に送信してくるものがほとんどです。ひどいときには承認待ちのコメントのほとんどがスパムとなり、整理するのも大変です。

これを防止するために、ブラックリストを作成したり、特定のメールアドレスを使ったコメントを防いだりするWordPress標準の機能もあるのですが、いずれも一度は受信して目にしなければなりませんし、そうした行為に使うメールアドレスは使い捨てのようなものがほとんどでしょうから、ブロックしてもしきれないでしょう。

今回の方法では、機械的に送られてくるスパムコメントを届いた瞬間にスパムとして振り分けるためのものですので、完全に防止することは不可能ですが、簡単なコードを追加するだけである程度のスパムコメント防止効果は期待できます。

Honeypot(ハニーポット)って何?今回の対策での具体的な動作

Honeypotは、直訳すると「はちみつの入った壺」という意味で、言葉の通り甘いものにおびき寄せるという意味があります。

今回作成するコメント用のHoneypotは、人間の目には見えなくて(非表示になっていて)、かつ、機械が入力しないとと思うような項目をわざと設けて、そこに入力があったらハイスパム!と判断するというものです。具体的には以下のようなしかけをして、動作させます。

  1. コメントフォームに非表示(人の目には見えない)入力項目を作る
  2. 1に入力があるかどうかでスパム判定をする
  3. 2でスパムと判定した場合には、「スパム」項目へ移動させる

スパムの場合そのまま捨ててしまってもよさそうですが、サイトへどの位スパムコメントがあるのかを知る必要もあると思いますので、「スパム」項目としてマーク(移動)させるようにしています。

スパムとしてマークしておくことで、Akismetプラグインなどがスパム判定の対象に含めるための要素となるようですので、併用される時にはスパムをそのまま残しておくとよいのかも知れません。

Honeypotを使ってスパムコメントを「スパム」項目へ即時に移動させる方法

スパムコメント対策は自力でコツコツ・・か、専用プラグインを使うのが一般的ではありますが、案外簡単なコードで実装することができます。

実装するには、以下のコードを有効化しているテーマのfunctions.phpへ挿入するだけです。

/*** コメント欄にハニーポット追加 ***/
/* コメントフォームにメアドの確認入力という非表示の項目を作る */
function ha_add_honeypot($postID) {
	echo '<p style="display:none">';
	echo '<textarea name="confirmationmail" cols="100%" rows="10" autocomplete="off"> </textarea>';
	echo '<label  for="confirmationmail">' . __("Please enter your email address again for confirmation","ha-basic") . '</label>';	
	echo '</p>';
}
add_action('comment_form', 'ha_add_honeypot');

/* 非表示項目に入力があったらスパムへ移動させる */
function ha_detect_honeypot($comment_status) {
   if (!empty($_POST['confirmationmail'])) {
        $comment_status = 'spam';
    }
	return $comment_status;
}
add_filter('pre_comment_approved', 'ha_detect_honeypot');

コードの簡単な解説

上記のコードでは「ha_add_honeypot」「ha_detect_honeypot」の2つのユーザー定義関数を使っています。

「ha_add_honeypot」では、コメントフォームの一番下へ「confirmationmail」というテキスト入力項目を設け、「確認のためメールアドレスを再入力してください」という説明を加えています。

フォーム項目自体は「style=”display:none”」を指定して、人間の目には見えないようにしています。

「ha_detect_honeypot」では、「ha_add_honeypot」で作成したダミー項目に入力があるかないかで、入力があれば送信と同時に「スパム」項目へ移動するようにしています

Honeypotがきちんと動作しているかの確認方法

そのままでは確認ができませんので、「ha_add_honeypot」内の以下(上)のコードを一旦下のコードへ書き換えます。

echo '<p style="display:none">';
echo '<p>';

スタイルでdisplay:none(非表示)にしているだけですので、解除するだけです。

これでコメントを受け付けている投稿のどれかを表示し、実際にメールアドレスの再入力欄へ入力後、送信ボタンをクリックしてみてください。

送信後管理画面のコメントをクリックし、スパム項目内にコメントが移動していればHoneypotは実装完了です。

そのままにしておくと、メールアドレスの再入力欄がすべてのコメントフォームで表示された状態になってしまいますから、確認が終わったら元に戻すようにしてください。

以上、たったこれだけのコードでコメントフォームへHoneypotが実装できるとは、私もびっくりしました。プラグインでどこかに登録したりする手間もありませんから、これで事足りるなら簡単でいいですね。

2021年5月25日現在、私が管理するサイトでそれまで使用していたプラグインを停止し、代わりにこのコードを入れていますがそもそもスパムがほぼないサイトばかり(コメントもほとんどない・・悲しいサイトばかり)ですので、効果については不明です。

貴サイトへ実装して効果があるようでしたら、SNSなどで拡散していただけたら幸いです。

参考:https://gist.github.com/vijujohns/b0b8582d50abc1bc508a

WordPressのカスタマイズ・不具合対応などご相談ください

Wordpressのカスタマイズ、不具合解消のご相談はすべてココナラのダイレクトメッセージからお受けしております。まずはこちらのバナーからお気軽にお問い合わせください。