問い合わせフォームの bot 対策は、ハニーポット・滞在時間・自動化検知・フィンガープリント・レートリミットの5つでほぼ説明がつきます。ただし、この5つが止めるのは「機械が送信したもの」だけです。人が手で書いて手で送った営業メールは、どれにも引っかかりません。
この記事は、中小企業の Web 担当者・情シス・問い合わせ担当者に向けて、bot 検知の代表的な手口を仕組みごとに分解し、「bot を止めた後に何が残るのか」を実フォームデータで示します。
bot 対策の前に、届くものを2種類に分ける
フォームに届く不要な送信は「機械が送る bot」と「人が書いて送る営業」の2種類で、必要な手段がまったく違います。
同じ「迷惑な問い合わせ」に見えても、前者は送信の挙動で見分けられ、後者は内容でしか見分けられません。bot 対策の記事を読んでも状況が改善しない場合、たいてい困っているのは後者です。基本の整理はフォームスパム対策の基本にまとめています。なお、この記事が扱うのはフォーム経由の送信だけです。メールアドレス宛に直接届くぶんは受信フィルタやドメイン認証など別の手当てが要るため、入口ごとの切り分けは会社の迷惑メール対策で整理しています。
bot 検知の代表的な5つの手法と、その仕組み
bot 検知は「人間なら残るはずの痕跡が無い」「人間ならやらない速さ・回数」の2点を見ています。
1. ハニーポット(おとりの入力欄)
人間には見えない入力欄をフォームに1つ置き、そこに値が入っていたら自動送信とみなす手法です。フォームの入力欄を片端から埋めていく汎用スクリプトは、見えない欄も一緒に埋めてしまいます。
訪問者に一切の操作を求めないのが最大の利点で、実装も数行で済みます。弱点は、そのサイト専用に作られたスクリプトには効かないこと、そして display:none の欄を避ける実装がすでに一般化していることです。ブラウザやパスワードマネージャの自動入力がおとり欄を埋める事故を避けるため、欄名を email2 のような紛らわしい名前にせず、autocomplete="off"・tabindex="-1"・aria-hidden="true" を付けるのが最低限の作法です。
2. 送信までの滞在時間(タイムトラップ)
フォームを表示した時刻を記録し、送信までの経過秒数を見る手法です。「表示から 1 秒で長文が送信された」は人の手ではほぼ起こりません。
弱点は、送信前に数秒待つだけで回避できる点です。誤検知のリスクも高く、短い問い合わせ、別のところで書いた文章の貼り付け、確認画面から戻っての再送信では、実際に数秒で送信が完了します。
3. 自動化検知(ヘッドレスブラウザの痕跡)
自動操作ツールがブラウザに残す痕跡を数える手法です。ヘッドレスブラウザとは、画面表示を伴わずにプログラムから操作されるブラウザのことです。
具体的には navigator.webdriver が true になっていないか、UA(ブラウザの自己申告文字列)に自動化ツール名が含まれていないか、window に自動化ツールが注入する固有のグローバル変数が生えていないか、といった痕跡を複数チェックします。素の自動化ツールはかなり明確に判別できます。
限界は2つあります。1つは痕跡を消す隠蔽用の拡張が出回っていること。もう1つは、そもそも JavaScript を実行せずフォームの送信先へ直接 POST してくる bot には、ブラウザ側の検知が届かないことです。後者はサーバー側のトークン検証(WordPress の nonce など)が担当する領域で、フロント側の bot 対策とは層が違います。
4. ブラウザのフィンガープリント
UA・言語・画面サイズ・タイムゾーン・描画特性などを組み合わせてハッシュ化し、「同じ端末らしさ」を見る手法です。cookie の初回発行からの経過日数を併用すると、「今この瞬間に用意された環境」かどうかの目安になります。
これは個人の特定ではなく、あくまで似た環境の束ね方です。同じ機種・同じ設定の端末はハッシュが衝突します。「ハッシュが一致した=同一人物」と断定した瞬間に誤検知が始まります。
5. レートリミット(単位時間あたりの送信回数)
IP アドレスやフォーム単位で、一定時間あたりの送信回数に上限を設ける手法です。「1 秒間に 10 通送る人間はいない」という単純な事実だけで、機械的な連投はかなり落とせます。
弱点は、IP を分散されると効かないこと、そしてネットワーク層の大規模な攻撃は CDN や WAF の担当領域であることです。誤検知としては NAT(複数人が 1 つの IP を共有する仕組み)が最大の落とし穴です。大企業のオフィス、学校、店舗の共有回線、モバイル回線では、無関係な複数人が同じ IP に見えます。
| 手法 | 止まるもの | すり抜けるもの | 主な誤検知リスク |
|---|---|---|---|
| ハニーポット | 全欄を埋める汎用スクリプト | サイト専用に作られた bot | 自動入力がおとり欄を埋める |
| 滞在時間 | 表示直後に送る自動送信 | 数秒待つだけの bot | 短文・貼り付け・再送信の本物 |
| 自動化検知 | 素のヘッドレスブラウザ | 痕跡を隠蔽した bot、JS を使わない直接 POST | 社内 RPA・自動テスト・一部の支援ツール |
| フィンガープリント | 同一環境からの連続送信 | 環境を毎回変える bot | 同一構成の社用 PC が同じハッシュになる |
| レートリミット | 短時間の連投 | 分散 IP からの少量送信 | NAT 配下の共有 IP(大企業・学校) |
| 人が書いた営業 | (どれも止まらない) | — | — |
表の最終行がこの記事の主題です。
実データ:bot を止めた先に残るのは「人が書いた営業」
bot を排除したフォームに残っていたのは、日本語として完璧な、人が書いた営業メールでした。
Hajik が分析した、美容商社(国内最大手・上場)の実フォームデータで確認しています。3種類のフォーム・合計 1,894 件・約 20 か月分で、内訳は問い合わせフォーム 534 件、採用フォーム 149 件、汎用フォーム 1,211 件です。重要なのは、これらがすべて reCAPTCHA v3 を通過した送信であるという点です。
| 観測 | 結果 |
|---|---|
| ボットスパム | reCAPTCHA 搭載サイトでは、明らかな bot は事実上ゼロだった |
| 問い合わせフォームの営業比率 | 営業(確度高) 12.9% / 本物らしい 54.9% / 判定困難 32.2% |
| 汎用フォームの営業比率 | 営業合計 56.2% / 本物らしい 16.5% / 判定困難 25.2% |
| 採用フォームの営業比率 | 全体の 65.8% が人材サービスの営業(中途採用フォームは 73.1%) |
分類は簡易ヒューリスティックによるもので、業種・規模・フォームの性格によって比率は大きく変わります。あくまで一社・一時点のサンプルとして読んでください。
reCAPTCHA が無意味だという話ではありません。bot 除去という役割では上表のとおり十分に働いており、役割が違うだけです。この線引きは reCAPTCHA との違いとreCAPTCHA をすり抜ける営業メールで詳しく整理しています。
なお、営業の中身にも傾向があります。人材紹介系の「ご紹介可能な人材がおります」「理論年収の◯%」、Web/SEO 系の「貴社サイトを拝見しました」「無料で診断」、制作系の「業界相場の 1/3」。共通の枕詞は「突然のご連絡失礼いたします」「ご提案させていただきたく」です。これらは滞在時間でもフィンガープリントでも判別できず、内容を読む以外に方法がありません。
閾値を上げるほど、止まるのは本物になる
閾値を上げても bot は増分ぶんしか止まらず、代わりに本物の問い合わせが落ち始めます。誤判定の許容方向は、営業を見逃すのは可、本物をブロックするのは不可。迷ったら本物として扱う。この方向を固定しないと、対策を強化するほど機会損失が増えます。
具体的に危ないのは次の設定です。
- 滞在時間の閾値を秒単位で引き上げる:実データでは本物の問い合わせほど短いという特徴があります。「この商品の在庫はありますか」の一行が典型です。
- フィンガープリント一致だけでブロック:同じ人が「返信が来ないのでもう一度」と送るのは、疑わしい挙動ではなく普通の顧客行動です。
- 短文や特定キーワードの機械的な拒否:ここを機械的に弾くと、いちばん取りこぼしたくない問い合わせから落ちます。
- 送信元企業を単位にした恒久ブラックリスト:同じ会社でも受け手の文脈が変われば営業にも本物にもなり、将来の取引先を自分で締め出す可能性があります。
そして忘れがちなのが、流入量の急増を攻撃のシグナルにしないことです。テレビ露出、SNS でのバズ、キャンペーンでの急増は正常なトラフィックです。量ではなく質で判断してください。
私たちが実際に何を取り、何をブロック条件にしていないか
Hajik のスクリプトは bot 系のシグナルを一通り収集していますが、それ単体をブロックの引き金にはしていません。
ブラウザ内で収集しているのは、マウス移動・キー入力・フォーカス・タッチの各回数、入力にかかった時間、最初の操作までの時間、自動化ツールの痕跡フラグ、環境ハッシュと cookie の経過日数。これらは背景情報にとどめ、スコアリングで中心的に効かせているのは本文の形態、入力項目どうしの整合性、日本語文脈を読む AI 判定です。記入項目の食い違いから社名を騙る送信を見抜く発想は、なりすましメールの対策で詳しく扱っています。
AI 判定にも過剰な期待はしていません。99% 以上を遮断し、残る約 1% は人が最終判断する前提で管理画面を作っています。判定の仕組み全体は機能一覧、対策の全体像は問い合わせフォームの営業メール対策(実務ガイド)にまとめています。
導入する順番:上から順に、安いものから
bot 対策は「無料で今日できること」から順に積み、内容判定は最後に載せるのが合理的です。
- サーバー側のトークン検証を確認する。CMS の標準機能(WordPress の nonce など)が有効か。
- ハニーポットを 1 つ置く。汎用スクリプトの多くが落ちます。
- レートリミットを緩めに設定する。IP 単位で厳しくせず、「1 分に 10 通」のような明らかな連投だけを対象にします。
- 自動化検知と滞在時間は、ブロックではなく記録から始める。まずログを 2 週間見て、自社の本物の問い合わせがどんな数値分布なのかを把握してください。
- ここまでやっても残る「人が書いた営業」は、内容で仕分ける。
Hajik はこの 5 段目を担当します。プラグイン導入・DNS 変更・フォームの action 変更は不要です。
よくある質問
ハニーポットと reCAPTCHA は併用すべきですか
併用して問題ありません。ハニーポットは訪問者に負担をかけないので、入れておいて損はありません。ただし両方入れても「人が書いた営業」は減りません。それは bot 対策の不足ではなく対象の違いです。
CAPTCHA を入れると問い合わせ数が減りませんか
画像選択のような操作を求める形式では、離脱の可能性は現実にあります。だからこそ、訪問者に何も求めないハニーポットとサーバー側トークン検証から始めるのが安全です。Hajik も訪問者に追加操作を求めません。
送信までの滞在時間は何秒を閾値にすべきですか
固定の推奨値は出せません。フォームの項目数と読者層によって適正値が変わります。まずは閾値でブロックせず、自社の実際の送信の分布を記録してください。
同じ会社から何度も営業が来ます。ドメインごと拒否してよいですか
推奨しません。実データでも、同一の送信元が同じフォームに 10 件以上送っている例は複数確認しています。それでも、企業単位の恒久的な拒否リストではなく、「頻度の高い送信元」という参考情報として扱うほうが安全です。
自社のフォームがどの段階にいるか、どう判断すればよいですか
直近 1 か月の不要な送信を 20 件ほど読んで、意味不明な機械送信と、日本語として成立した営業提案の比率を数えてください。後者が多いなら bot 対策の強化では解決しません。判断が難しい場合は無料診断で状況を整理できます。
まとめ
明日やることは、滞在時間と自動化検知でブロックせず 2 週間ログを取り、残った不要な送信を 20 件読んで機械送信か営業かを数えること。挙動でブロックするのは緩めに、残りは内容で仕分ける。これが実運用で行き着いた結論です。
Hajik は、GrowGroup が運営する日本語特化の B2B SaaS です。script タグ 1 行で、フォーム送信の瞬間にボットスパムと人が書いた営業メールを選別し、本物の問い合わせだけを担当者に届けます。フォームの内容はブラウザ内で暗号化してから保存するため、Hajik 側で保管データを復号することはできません(判定の瞬間だけ、精度のために内容を AI に渡します。クレジットカード番号・マイナンバー・銀行口座・パスポート番号・健康情報の 5 種はブラウザ内で除去してから送ります)。詳しくはセキュリティをご覧ください。
自社のフォームの状態を知りたい方は無料診断から、実際の判定を試したい方は14 日間の無料トライアルからどうぞ。