ウェブサイトのフォームに日々届くスパムメッセージにうんざりしていませんか?
特に「Contact Form 7」をご利用の場合、手軽に設置できる反面、スパムの標的になりやすいという側面もあります。これまでは、reCAPTCHAのv2やv3が無料で利用できる主な対策でした。ところが、一定数を超えると有料になるように改悪されてしまいました。
特に、最近のスパムはちょこちょこ送られてくるだけでなく、数分おきに大量に送られてくる場合もあります。
この記事では、そんな悩みを解決するために、reCAPTCHAを使わずに、Contact Form 7で「特定のキーワードを含む送信をブロックする」という、よりきめ細やかなスパム対策をご紹介します。
この方法を使えば、商品やサービスに全く関係のない宣伝、あるいは不適切な言葉を含むメッセージなど、あなたがブロックしたい特定のキーワードを含むフォーム送信を未然に防ぐことが可能になります。
効果的な設定方法から注意点まで、具体的な手順を交えて詳しく解説していきますので、ぜひこの記事を読んで、あなたのウェブサイトのフォームをスパムから強力に保護しましょう。
スパムメールの例
例えば、最近のスパムメールでは「BTC」というキーワードを含んだ、以下のようなものが届くことがあります。
・名前:📢 Ticket- Process 1,434441 BTC. Next => https://graph.org/Message–05654-03-25?hs=316c65af2b1f4349a4e6998d988f889a& 📢
・フリガナ:nf6xnw
・メールアドレス:roofa2000@automisly.org
・電話番号:650469440537
・Line登録用ID:yyyymmddhhmmss
他には以下のようなものもあります。
差出人: Joanna Riggs joannariggs07@gmail.com
題名: [your-subject]
メッセージ本文:
Hi,
I just visited your website and wondered if you’ve ever considered an impactful video to advertise your business? Our videos can generate impressive results on both your website and across social media.
We specialize in creating both animated and non-animated videos, with prices starting from just $195 (USD).
Our approach combines high-quality stock animations and footage with your own content (like existing clips, photos, and images). This allows us to produce professional, engaging videos affordably, without the need for on-location live filming.
Would you be open to seeing some examples of our previous work?
If this isn’t the right time or fit for you, please feel free to use the unsubscribe link below to opt-out of future communications.
Regards,
Jo
節操がなくまったくもって迷惑です。
指定したキーワードを含む送信をブロックする方法
Cotact Form7を使っているなら、比較的簡単に指定したキーワードを含む送信をブロックすることができます。
functions.phpに以下を追記します。
// Contact form7で指定KWを含む申込をブロックする
add_filter('wpcf7_validate', 'block_btc_spam', 10, 2);
function block_btc_spam($result, $tag) {
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
foreach ($_POST as $value) {
if (stripos($value, 'ブロックしたいキーワード') !== false) {
$result->invalidate('', '入力内容をご確認ください。');
break;
}
}
}
return $result;
}
このコードで、入力内容に指定したキーワードが含まれていた場合に、送信をブロックし、エラーメッセージを表示します。
コード解説
POSTの処理が走った場合に、検証を実行します。
if (stripos($value, 'ブロックしたいキーワード') !== false) {
striposはPHPのメソッドの一つで、大文字と小文字を区別せずに、ある文字列(haystack)の中に別の文字列(needle)が最初に現れる位置を返します。存在しない場合はfalseを返します。
つまり、POSTで送られてきた内容の中に、指定したキーワードが含まれる場合は false以外を返し、その次の処理を実行します。
$result->invalidate('', 'エラーメッセージ');
これは、Contact Form 7 のバリデーション(入力内容の検証)処理において、フォーム全体の送信を無効化し、ユーザーにエラーメッセージを表示するためのコードです。
$result
は Contact Form 7 のバリデーション結果を管理するオブジェクトです。フォームが送信された際に、各入力フィールドの検証結果や、全体としての送信の可否を保持します。
invalidate()
メソッド は、フォームの特定のフィールド、またはフォーム全体に対してエラーを発生させるために使用されます。つまり、「この入力は正しくありません」とシステムに伝える役割があります。
''
(空文字列) invalidate()
メソッドの最初の引数は、エラーメッセージを関連付けるフィールドの名前を指定します。ここに空文字列 ''
を指定することで、特定のフィールドではなく、フォーム全体のエラーとして扱われます。これにより、通常はフォームの一番上など、どこか分かりやすい場所にエラーメッセージが表示されます。
'エラーメッセージ'
は、実際にユーザーに表示されるエラーメッセージです。
複数のキーワードをブロックする
複数のキーワードをブロックしたい場合は、以下のように、if文の中で stripos を || でつなぎます。
add_filter('wpcf7_validate', 'block_btc_spam', 10, 2);
function block_btc_spam($result, $tag) {
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
foreach ($_POST as $value) {
if (
stripos($value, 'yyyymm') !== false ||
stripos($value, 'BTC') !== false
) {
$result->invalidate('', '入力内容をご確認ください。');
break;
}
}
}
return $result;
}