[WordPress] ContactForm7 のスパム問い合わせ対策 (PHP使用)

ContactForm7

WordPress製のサイトに問い合わせフォームを設置するため、一番たくさん使われているプラグインは「ContactForm7」。(おそらく)
日本製なので、設定は日本語で使いやすい。わからない事などはネットに多く載っているし、とてもお世話になっています。

スパム頻発!

当たり前ですが、スパムは時々ありました。セールス目的のものや、英語たけのもの。世界に公開しているのだから仕方ないと黙認(?)していました。

パニック

ところが、ある日から三日間、海外からのスパムが頻発しました。
ひどい時は数分おきに・・・

記述はすべてアルファベット、自由記述欄の文章はスペイン語っぽい。メールアドレスは海外のフリーメール。メールアドレスは毎回違いますが、どうも実際に使っているものっぽい。

ひょっとしたら、不正入手されたアドレスリスト?
 → 自動返信メールを出しているので、放置しているとこちらのサイトがスパムと見做されるかも・・・

対処方法は?

「問い合わせメールが邪魔だ!」という社内の声もあり、対策をネットで探すことにしました。
まず見かけたのは、スパム対策用のプラグイン。そして「私はロボットではありません」を表示させる reCAPTCHA 。

ただ、プラグインのインストールが必要だったり、reCAPTCHA の設定が必要。そしてどれも、既存のフォームを修正しなければなりません。複数のサイトがあり、複数の問い合わせフォームがあるので、ちょっとしんどいな。

発見!

当方、大抵のことは PHP でやっているので、できれば PHP だけで済まないか?
と探したところ、見つけました。いつもお世話になっている Qiita さんの記事です。

 → Contact Form 7 のカスタムバリデーションの書き方

他のサイトにもいくつか有りましたが、この記事が一番詳しかったです。
(探せばもっと有るかもしれませんが)

PHP 作成

記事を参考に、PHP を作りました。

<?php
add_filter('wpcf7_validate', 'wpcf7_spamblock', 11, 2);

function wpcf7_spamblock($result,$tags){
	foreach( $tags as $tag ){
		$type = $tag['type'];
		$name = $tag['name'];
		$post = $_POST[$name];

		$post = strtr($post, "\n", "");
		$post = str_replace(array(" ", " "), "", $post);
		$post = trim($post);

		// 入力妥当性チェック
		switch($type){
			case 'text':
			case 'text*':
				if( !empty($post) && preg_match('/^[!-~]+$/', $post) ){
					$result->invalidate( $name, '日本語を入力してください' );
				}
				break;
		}
	}
	return $result;
}
?>

ほとんどコピペですが、1点だけ改造しました。
11行目で、文字列の途中にある空白を削除しています。
テストしていると、アルファベット文字列の途中に空白がある場合、マッチしない事が判明。正規表現を見直すのも面倒くさいので、安易に str_replace しました。

また、元記事には「電話番号のチェック」もあるので、ご参照ください。

セールス目的もブロック

お断り

上のソースには載せていませんが、実際にはセールス目的の問い合わせもブロックしています。ほとんどのケースでは、自由記述欄にセールス文書が長々と書かれています。そこて、単純に記述内容 ($post) の長さをチェックし、エラーにしています。

蛇足

実装方法は、functions.php に上のソースを記述するだけで、フォームの修正などは不要です。これこそ望んでいたものです。

なお当方では複数サイトがあり、メンテナンスも考えて直接記述はしていません。上記を別ファイルにし、functions.php で include しています。

コメント

タイトルとURLをコピーしました