Contact Form 7で英語のスパムメールをブロックする方法

Contact Form 7で英語のスパムメールをブロックする方法

WordPressでウェブサイトを運営している方の多くが利用しているお問い合わせフォーム作成用のプラグイン「Contact Form 7」。お問い合わせフォームの作成が簡単にできて便利なのですがスパムメールが多いのが悩みの種です。そんな中でも英語のみのメールが大量に送られてきたりすることもあります。非常に迷惑なのでその対応策を解説します。

目次

Contact Form 7で英語のスパムメールが送られてくる仕組み

1. スパムボットがWebサイトを自動巡回

  • ボットはインターネット上のWebサイトを自動的に巡回し、フォームのHTML構造を検出します。
  • <form>タグを見つけると、その中のname=""属性やaction=""属性などを解析して、送信先(POST先)や入力項目を特定します。

2. CSRF保護がないフォームは標的にされやすい

  • Contact Form 7は一応トークンを用いた保護がありますが、完璧ではありません。
  • 特にJavaScriptを無効にしても動作する構造(=ボットがアクセスしやすい)になっているため、狙われやすい傾向にあります。

3. ランダムまたは大量のテンプレ英語メッセージを流し込む

  • 典型的な例:
    • 英語のセールスメール(SEO、ウェブ制作、仮想通貨など)
    • URLつきの宣伝やフィッシング
    • 不自然な英文の羅列(意味のない文字列)
    • AIで自動生成されたっぽい自然文
  • これらをフォームのテキストエリアや名前欄などに入力し、自動送信します。

なぜContact Form 7が狙われやすい?

理由説明
世界中で広く使われているWordPressフォームの定番なので、攻撃者もテンプレ対応しやすい
HTML構造が予測しやすいwpcf7-form-controlなど特定のclassやname属性が決まっている
スクリプトによる送信が可能な場合もreCAPTCHAなどを入れていないと、POSTだけで送信できてしまう
通常のバリデーションでは弾けない英語メッセージも「文字列」なので、形式的にはエラーにならない

スパムをブロックする方法

Contact Form 7のスパム防止には様々な方法がありますが、今回は英語のみのメールが届く場合に有効な方法です。英語のみのメール…つまり日本語が含まれないメールです。そこでフォームのテキスト入力欄(たとえば「お名前」「お問い合わせ内容」など)に日本語が1文字も含まれていない場合、送信エラーにすることで、英語のスパムをブロックします。方法は以下の通りです。テーマファイルのfunctions.phpに追記することで対応します。

WordPressの管理画面から以下へアクセス

外観 → テーマファイルエディター → functions.php(テーマの一番下のファイル)

以下のコードを貼り付けます

function my_cf7_block_non_japanese_text($result, $tag) {
  $name = $tag['name'];

  // 対象にする項目名(フォームタグ名を指定)
  $target_fields = ['your-name', 'your-message'];

  // 該当項目以外はスキップ
  if (!in_array($name, $target_fields)) {
    return $result;
  }

  $value = isset($_POST[$name]) ? $_POST[$name] : '';

  // 日本語(ひらがな・カタカナ・漢字)が含まれているかチェック
  if (!preg_match('/[\p{Hiragana}\p{Katakana}\p{Han}]/u', $value)) {
    $result->invalidate($tag, '日本語を含めて入力してください。');
  }

  return $result;
}
add_filter('wpcf7_validate_text*', 'my_cf7_block_non_japanese_text', 10, 2);
add_filter('wpcf7_validate_text', 'my_cf7_block_non_japanese_text', 10, 2);
add_filter('wpcf7_validate_textarea*', 'my_cf7_block_non_japanese_text', 10, 2);
add_filter('wpcf7_validate_textarea', 'my_cf7_block_non_japanese_text', 10, 2);

解説

部分意味・役割
$target_fields = ['your-name', 'your-message'];チェック対象にするフォームの name 属性。Contact Form 7 のフォーム内にある [text your-name][textarea your-message] を指定します。必要に応じて増減可能。
preg_match('/[\p{Hiragana}\p{Katakana}\p{Han}]/u', $value)入力内容に「ひらがな」「カタカナ」「漢字」のいずれかが含まれているかをチェックします。含まれていなければバリデーションエラーに。
$result->invalidate()エラーメッセージを表示して送信をブロックします。

フォーム側の設定(確認)

Contact Form 7 のフォーム内で、次のようなフィールドが使われているとします。

[text* your-name "お名前"]
[textarea* your-message "お問い合わせ内容"]

この場合、your-nameyour-message に日本語が1文字もないと送信できなくなります。

よくある質問

半角英数字だけの日本語メールは通りますか?

通りません。ひらがな・カタカナ・漢字のいずれかが必要です。

英語と日本語が混在していれば送信されますか?

はい、OKです。例:「Hello、お世話になります。」は通過します。

英語の名前(例:John Smith)は?

your-name にも日本語1文字が必要なのでエラーになります。日本語以外も許容したい場合はその項目を除外してください。

$target_fields = ['your-message']; // 「名前」は除外
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

初めてホームページを作成したのは1996年。
2000年よりフリーランスで主に中小企業、学校、各種公的団体、個人事業主のWordPressを活用したホームページ制作を行っています。WordPressテーマはそれぞれのクライアントに合わせて作成しています。
WordPressを活用したサイト運営のための情報発信をしていきます。

目次