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 しています。
コメント