症状別 /
問い合わせフォームに大量のスパムが届く・止まらない
問い合わせフォームに英語・中国語のスパムが連続投下される状態の即時対処と再発防止。reCAPTCHAだけでは止まらない理由、Cloudflare Turnstile + ハニーポット + CleanTalk + Bot Fight Mode の多層構成、ECサイト固有の「業務連絡を装うスパム」への運用ルール設計まで実装ベースで解説します。
問い合わせフォームに英語の長文、中国語の宣伝文、明らかにBOTが投下した記号の羅列が混じり始めた。最初の数件は手で削除できます。しかし1日に50件、100件と積み上がってくると、本物の問い合わせが埋もれます。これは現場で「フォームスパム洪水」と呼ばれる状態で、放置すると本来の見込み客を取りこぼします。
スパム送信元はほぼ確実にBOTです。攻撃者はWordPress の `wp-admin/admin-ajax.php` や Contact Form 7 のエンドポイント、`/wp-json/contact-form-7/v1/contact-forms/*/feedback` を狙ってPOSTを投げ続けます。あるいはフォームの構造そのものを解析し、`name`、`email`、`message` という典型的なフィールド名を埋めて送ってきます。
## 短期で効くもの・効かないもの
まず期待しないでほしいのが、メッセージ内のキーワードによるフィルタリングです。短期では効きますが、攻撃者はすぐに表記を変えます。「c.i.a.l.i.s」「c i a l i s」など、文字種を変えただけで素通りします。
reCAPTCHA v2(あの「私はロボットではありません」のチェックボックス)も2026年現在では決定打になりません。BOT側がパズル解法サービス(2captcha、Anti-Captcha など)を月数百円で利用しており、チェックを通り抜けてきます。
効くのは2つ、順番に重ねてください。
一つ目は Cloudflare Turnstile への切り替え。reCAPTCHA v3 や hCaptcha でも構いませんが、Turnstile は無料で UX を阻害せず、Cloudflare 配下で動作中なら設定が数分で済みます。導入直後でスパム流入が80%程度減ります。
二つ目はハニーポット(honeypot)フィールドの仕込み。フォームに `display:none` で隠した入力欄を置き、人間には見えない・BOT は律儀に埋めるという性質を利用して弾きます。Contact Form 7 なら `Honeypot for Contact Form 7` プラグイン、自前実装なら3行で済みます。これだけで残った20%のうち、さらに半分以上が消えます。
## 根本的な手当て
ここから先は「攻撃を減らす」のではなく「攻撃を受け止めない」設計の話です。
エンドポイント自体に Cloudflare の Bot Fight Mode、もしくは WAF ルールを敷きます。`POST /wp-json/contact-form-7/*` に対して、リクエスト元 IP がデータセンター帯(AS番号で Amazon、DigitalOcean、Vultr など)の場合は即時 403。これだけで実運用のスパムは99%以上消滅します。日本人ユーザーがクラウドVPS経由で問い合わせフォームを使う確率は限りなく低いので、副作用も無視できる程度です。
WordPress を使っているなら、Akismet(年額契約)か CleanTalk を併用します。Akismet は判定が緩めで「うちのフォームには弱い」と感じる現場も多いですが、CleanTalk は判定基準を細かく設定でき、月数百円で日本語スパムにも対応します。経験的には CleanTalk のほうが体感の精度は高いです。
## メール側の落とし穴
ECサイトに連絡フォームを置いている場合は、別の罠があります。スパムが「在庫問い合わせ」「卸売希望」を装って投下されると、運用者がメールに反応してしまう。これは技術的な弾きが効きづらく、運用ルール側で「メールリンクを開く前にヘッダーで送信元IPを確認」「外部メールゲートウェイ(M365 Defender、Google Workspace のスパムフィルタ)で送信元評価が低いものを格上げ隔離」という二重防御を組みます。
メール側の SPF/DKIM/DMARC がそもそも未設定だと、スパムが「正常な問い合わせ」として Gmail に届いてしまい、運用者の判断ミスを誘発します。フォームスパム対策は、フォーム単体ではなく送受信メール側まで含めて見直すのが現実的です。
## やってはいけないこと
「フォームを撤去してメールアドレスだけ載せる」は最悪の選択肢です。メールアドレスは収集BOTにかかれば1分で抜かれ、より深刻なスパム洪水に変わります。フォームを残したまま、認証と弾きを多層化するのが正解です。
「IPアドレスをWAFで手動ブロック」は短期しか効きません。BOTの送信元は数千〜数万のIPを使い分け、ブラックリストの更新が追いつきません。AS番号やリクエスト特性(Cookie 不在、User-Agent パターン、JS実行不可)でブロックするほうが効果的です。
実装が回らない場合や、フォーム以外(管理画面ログイン、コメント欄、会員登録)にも同じBOTからの攻撃が来ている場合は、フォーム単体の対策ではなくサイト全体の WAF/Bot 対策の見直しが必要です。当センターでは Cloudflare 設定の見直しと WordPress 側プラグイン構成の最適化を1営業日〜で対応しています。
スパム送信元はほぼ確実にBOTです。攻撃者はWordPress の `wp-admin/admin-ajax.php` や Contact Form 7 のエンドポイント、`/wp-json/contact-form-7/v1/contact-forms/*/feedback` を狙ってPOSTを投げ続けます。あるいはフォームの構造そのものを解析し、`name`、`email`、`message` という典型的なフィールド名を埋めて送ってきます。
## 短期で効くもの・効かないもの
まず期待しないでほしいのが、メッセージ内のキーワードによるフィルタリングです。短期では効きますが、攻撃者はすぐに表記を変えます。「c.i.a.l.i.s」「c i a l i s」など、文字種を変えただけで素通りします。
reCAPTCHA v2(あの「私はロボットではありません」のチェックボックス)も2026年現在では決定打になりません。BOT側がパズル解法サービス(2captcha、Anti-Captcha など)を月数百円で利用しており、チェックを通り抜けてきます。
効くのは2つ、順番に重ねてください。
一つ目は Cloudflare Turnstile への切り替え。reCAPTCHA v3 や hCaptcha でも構いませんが、Turnstile は無料で UX を阻害せず、Cloudflare 配下で動作中なら設定が数分で済みます。導入直後でスパム流入が80%程度減ります。
二つ目はハニーポット(honeypot)フィールドの仕込み。フォームに `display:none` で隠した入力欄を置き、人間には見えない・BOT は律儀に埋めるという性質を利用して弾きます。Contact Form 7 なら `Honeypot for Contact Form 7` プラグイン、自前実装なら3行で済みます。これだけで残った20%のうち、さらに半分以上が消えます。
## 根本的な手当て
ここから先は「攻撃を減らす」のではなく「攻撃を受け止めない」設計の話です。
エンドポイント自体に Cloudflare の Bot Fight Mode、もしくは WAF ルールを敷きます。`POST /wp-json/contact-form-7/*` に対して、リクエスト元 IP がデータセンター帯(AS番号で Amazon、DigitalOcean、Vultr など)の場合は即時 403。これだけで実運用のスパムは99%以上消滅します。日本人ユーザーがクラウドVPS経由で問い合わせフォームを使う確率は限りなく低いので、副作用も無視できる程度です。
WordPress を使っているなら、Akismet(年額契約)か CleanTalk を併用します。Akismet は判定が緩めで「うちのフォームには弱い」と感じる現場も多いですが、CleanTalk は判定基準を細かく設定でき、月数百円で日本語スパムにも対応します。経験的には CleanTalk のほうが体感の精度は高いです。
## メール側の落とし穴
ECサイトに連絡フォームを置いている場合は、別の罠があります。スパムが「在庫問い合わせ」「卸売希望」を装って投下されると、運用者がメールに反応してしまう。これは技術的な弾きが効きづらく、運用ルール側で「メールリンクを開く前にヘッダーで送信元IPを確認」「外部メールゲートウェイ(M365 Defender、Google Workspace のスパムフィルタ)で送信元評価が低いものを格上げ隔離」という二重防御を組みます。
メール側の SPF/DKIM/DMARC がそもそも未設定だと、スパムが「正常な問い合わせ」として Gmail に届いてしまい、運用者の判断ミスを誘発します。フォームスパム対策は、フォーム単体ではなく送受信メール側まで含めて見直すのが現実的です。
## やってはいけないこと
「フォームを撤去してメールアドレスだけ載せる」は最悪の選択肢です。メールアドレスは収集BOTにかかれば1分で抜かれ、より深刻なスパム洪水に変わります。フォームを残したまま、認証と弾きを多層化するのが正解です。
「IPアドレスをWAFで手動ブロック」は短期しか効きません。BOTの送信元は数千〜数万のIPを使い分け、ブラックリストの更新が追いつきません。AS番号やリクエスト特性(Cookie 不在、User-Agent パターン、JS実行不可)でブロックするほうが効果的です。
実装が回らない場合や、フォーム以外(管理画面ログイン、コメント欄、会員登録)にも同じBOTからの攻撃が来ている場合は、フォーム単体の対策ではなくサイト全体の WAF/Bot 対策の見直しが必要です。当センターでは Cloudflare 設定の見直しと WordPress 側プラグイン構成の最適化を1営業日〜で対応しています。
初動チェックリスト
- 1.管理画面ログから過去24時間のフォーム送信件数と送信元IPの分布を確認
- 2.送信元IPがデータセンター帯(AWS、GCP、DigitalOcean、Vultr 等)に偏っていないか確認
- 3.現在の reCAPTCHA / Turnstile / hCaptcha の設定状態と動作確認
- 4.Contact Form 7 等のプラグインバージョンとハニーポット導入の有無
- 5.メールゲートウェイ側(Google Workspace、M365 Defender)の迷惑メール判定状況
- 6.SPF / DKIM / DMARC レコードの設定状態を `dig TXT` で確認
この症状でお困りなら、まず無料相談
60分無料相談を予約