
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-name
と your-message
に日本語が1文字もないと送信できなくなります。
よくある質問
- 半角英数字だけの日本語メールは通りますか?
-
通りません。ひらがな・カタカナ・漢字のいずれかが必要です。
- 英語と日本語が混在していれば送信されますか?
-
はい、OKです。例:「Hello、お世話になります。」は通過します。
- 英語の名前(例:John Smith)は?
-
your-name
にも日本語1文字が必要なのでエラーになります。日本語以外も許容したい場合はその項目を除外してください。$target_fields = ['your-message']; // 「名前」は除外