スパム対策としてreCAPCHA導入

お問い合わせでよく使うプラグイン「Contact Form7」とかは、オプションでreCAPTCHAを導入できますが、教室の予約やイベント参加申し込みなどで使っている「Events Manager」にはスパム対策がないようです。

そしていつの間にかスパムに見初められてしまうとさあ大変…
予約席を専有されるし、予約が入ったと喜んでもスパムだったり、実質的にも精神的にもダメージが大きい(´・ω・`)
なんとかならないか考えてみました。

実は最初、Events Manager の入力フォームをごっそり消して、Contact Form7 のショートコードを無理やりねじ込むという荒業を使ってました。
もちろん予約管理などできないので、根本的には使いにくくなるのですが、スパムを避ける一時的な処理としては効果がありました。
まあ、使いにくければ長くは続かなくなるのは道理です。
ということで、Events Manager の機能を保持しつつ、スパム対策を導入することにしたわけです。

そうはいってもスパム対策に選択肢はあまりありません。
とりあえずreCAPTCHAを導入します。
reCAPTCHAのサイトキーとシークレットキーの取得方法は割愛します。ちなみにこの2つのキーについては検索するといっぱい説明してくれているサイトがありますので探してみてください。

さて、導入するreCAPTCHAはGoogleが提供するものを使います。
Contact Form7 ですでに使っているので、同じキーでいいでしょう。…良いんだよね(汗)

特定のプラグインに対してreCAPTCHAを入れてくれるプラグインはいくつか存在するのですが、自分で作った入力フォームに対して対応してくれるものがありません…
やっと見つけたのが「Advanced noCaptcha & invisible Captcha」です。
いくつかのページでいろいろな reCAPTCHA のプラグインの説明を読んでいる時に、偶然見つけました。
2万DL以上あるので有名なプラグインですよね。でも「カスタムフォーム対応」はあまり調べても出てきませんでした。

さて、とりあえずインストールします。
プラグインのインストールは割愛します…
設定もサイトキーとシークレットキーを入れるだけで特に変えません。デフォのままです。

設定のタグに「instruction」がありますので、そこに設置方法が書いてあります。
といっても走り書きのようなものなので、実際には元サイトへ行って調べてみました。
【Advanced noCaptcha reCaptcha】 ※英語です。
Implement in Custom Form

グーグル先生に翻訳してもらいながら読み解くと

「do_action( ‘anr_captcha_form_field’ )を[送信]ボタンの前に配置するんやで」
とのこと。謎の関西弁は昨夜「ゆるキャン△2」を見たせいでしょう。


……
それって Events Manager のどこよ?

しょうがないから1つずつ調べていきましょう…

で、たどり着いたのがプラグインフォルダの [ event-manager/templates/forms/bookingform/ ] の booking-fields.php です。

<注意>
ワタクシ、フィルターフックおよびアクションフックがいまいち理解できてません。
一応フィルターフックでやってみたのですが、なぜか formタグの外に書かれてしまいました。
申し訳ありませんが、今回は(いや今後も…)直接書き込むので、この改造方法はバージョンアップの際にはその都度修正が必要ってことをご了承ください。

実際に書き込んだのは最後のところです。この時は29行目に挿入しました。

<?php
	do_action( 'anr_captcha_form_field' );
	if ( !anr_verify_captcha() ) {
		echo
		"<script type='text/javascript'>jQuery( funciton($) {
			$( '.em-booking-form' ).submit(function() {
				$( '.em-booking-form' ).off( 'submit' );
				return false;
			} );
		} );
		</script>";
	}
?>

としてみました。
reCAPTCHA(v3)で判定して、アウトなら送信をキャンセルしています。
これで良いのかどうかテストできないのが難点。
とりあえず毎日送られてくる偽の予約が入らなくなればOKです。
明日から検証(待つのみですが)してみます。

ちなみに手動で申し込みはできたので、ボットも申し込める方に1万点です…
自信ない…

<2021-04-06 追記>
思ったとおり…いやだめなんですが、全然防いでくれません。
構文が間違っているのか、アクセスした時点で anr_verify_captcha() は false を返してきます。
でもって、肝心のスパムは submit を踏んでないみたいです。
今頃知りましたが、action を覚えてそっちにデータを直接投げてるんですね…
ということで、この方法は意味がないことがわかりました。
これを諦めて、新しいイベント予約システムの構築します…