株式会社インテンス Webシステム活用ガイド

問い合わせフォームのスパム対策・セキュリティ設計ガイド|reCAPTCHAだけに頼らない実装の考え方

問い合わせフォームは、利用者にとっては連絡窓口ですが、攻撃側から見ると入力と送信ができる公開入口でもあります。対策を強くしすぎると正規ユーザーが離れやすくなり、弱すぎると運用側の確認負担が増えます。大切なのは、1つの仕組みで全部を防ごうとせず、負担の少ない対策を重ねていくことです。

このページでは、reCAPTCHA のような認証だけに頼らず、入力内容、送信頻度、通常・保留・拒否の判定、自動返信、メール送信、ログ確認をどの順番で設計するかを解説します。医療、学校、ホテル、物流など、利用者層や入力内容が異なるフォームにも適用できる考え方です。

この記事の対象読者
・問い合わせフォーム経由のスパム投稿が増え、運用の負担が大きくなっている担当者
・reCAPTCHA を導入したものの、利用者の使いにくさが気になっている方
・複数フォームに共通で使える対策方針を決めておきたい方

スパム対策は、利用者に見えにくい複数の判定を組み合わせます

フォーム対策では、難しい認証を1つ入れれば終わりだと思われがちですが、実際にはそう単純ではありません。画像認証を強くすればボットは減っても、正規ユーザーの送信率が下がることがあります。逆に、入力しやすさだけを優先すると、運用側の受信箱が荒れやすくなります。

役割を分けると、利用者に強い認証を毎回求めず、複数の兆候から要確認の投稿だけを選べます。

対策の強さは、件数・被害・利用者層で決めます

1. スパム件数と業務影響を切り分ける

1日数件の迷惑投稿であれば、運用で処理した方が早い場合もあります。一方で、自動返信メールが大量に飛ぶ、担当者の確認時間が大きい、深夜に連続投稿がある、といった場合は構成を見直した方がよいことがあります。

2. 利用者層に合わない認証は避ける

高齢者やスマホ入力が中心のフォームでは、難しい画像認証が負担になりやすくなります。対策の強さは、攻撃の多さだけでなく利用者層でも判断した方が自然です。

3. フォームごとに優先順位を変える

一般問い合わせ、資料請求、見学予約、障害連絡など、フォームの性質が違えば、求められる安全性も変わります。全部同じ設定にするより、優先度を分けた方が扱いやすくなります。

導入前に決める項目
認証方式だけでなく、どの投稿を保留・拒否にするか、自動返信をいつ送るか、判定理由をどこまで記録するかも決めます。境界が曖昧な投稿を最初から拒否すると、通常の問い合わせを失うため、まず保留で確認できる構成が安全です。

迷惑投稿の型に応じて判定条件を変えます

1つの条件だけで拒否せず、入力内容・送信時間・送信頻度などの兆候を組み合わせます。次の表は、よくある投稿と最初に確認する項目の例です。

投稿の型 確認する項目 判定時の注意
URLが多い宣伝投稿 本文中のURL数、名前欄や会社名欄へのURL入力、同じ文面の反復 製品URLや参考資料を送る正規利用もあるため、URL数だけで拒否しません。
全項目を機械的に埋める投稿 honeypot、フォーム表示から送信までの時間、不自然に均一な入力 ブラウザーの自動入力も考慮し、honeypotへの入力だけで即時拒否しない設計も検討します。
短時間の連続投稿 フォーム別の送信回数、時間帯、IP、User-Agent 企業・学校・ホテルなどの共有回線では同じIPから正規投稿が続くことがあります。
問い合わせを装う営業文 頻出語、同一本文、問い合わせ種別との不一致、過去の判定履歴 単語の一致だけでは誤判定が増えるため、保留後の確認結果を判定条件へ反映します。

画面構成例:入力・送信・メール・ログの各段階で判定する

次の画面例は、左にフォーム周辺の対策、右に運用側が確認する値を配置したものです。入力画面の見た目ではなく、各段階の役割を示しています。

画面例:フォーム防御の段階と運用メモ 入力時、送信時、メール送信前、ログ確認の段で役割を分ける構成例
利用者に見えにくい対策の積み方 操作負担を増やしにくいものから先に置く考え方
フォーム画面 最初に置く軽い対策

honeypot のような見えない項目や、フォーム表示から送信までの時間計測は、利用者の操作をほとんど増やさずに導入しやすくなります。

honeypot 送信時間
送信判定 即時に止めるか、スコアを下げるかを決める段

短時間連投、特定の記号列、URLの多さなどを見て、即拒否にするものと、要注意として扱うものを分けておくと調整しやすくなります。

短時間連投 URL多発
メール送信前 運用負担を増やす投稿を止める段

差出人名や件名への改行混入、危険な添付、本文の異常な長さを確認し、不正送信や意図しないメール処理を防ぎます。

改行除去 添付制限
追加認証 必要なフォームだけ使う

reCAPTCHA や簡易認証は、被害の大きいフォームに限って使う方が利用者の負担を増やしすぎずに済みます。

高リスクだけ
運用側の確認ポイント 何が増えたら見直すかを決めておくためのメモ例
一般問い合わせフォーム
資料請求フォーム
障害連絡フォーム
確認する値 1:短時間の連続送信

同じ IP や似た User-Agent から短時間に投稿が増えていないかを見ると、異常の早期発見に使いやすくなります。

確認する値 2:自動返信メールの送信数

フォーム自体より、返信メールの急増で気づくこともあります。通知量の異常は先に見ておく価値があります。

確認する値 3:弾いた件数の推移

対策を強めたあとに弾いた件数だけが増えていないか、正規ユーザーに影響していないかも合わせて見た方が安心です。

利用者の操作を増やさない対策から導入します

最初は入力チェック、honeypot、送信時間の計測から始め、判定結果を記録します。その後、実際の投稿傾向を見ながら回数制限や追加認証を設定します。

見えない対策

honeypot

画面には見えない項目へ値が入った時に弾く方法です。古いボットには今でも一定の効果が期待できます。

時間判定

送信までの経過時間

人間ならかかるはずの入力時間を極端に下回る送信を、要注意として扱う考え方です。

入力内容

URLや記号の偏りを見る

本文中の URL 数や不自然な記号列を見て、スコアを下げる材料にする方法です。即拒否にしない方が扱いやすい場合もあります。

表示負担

簡易認証の使い分け

すべてのフォームに同じ認証を入れるより、被害が大きい場所に絞る方が現実的なことがあります。

判定結果を通常受信・保留・拒否に分けます

怪しい兆候が1つあるだけで拒否すると、通常の問い合わせも失います。複数の判定結果を使い、処理を3段階に分けます。

判定 送信後の処理 使う場面
通常受信 保存、担当者への通知、自動返信を実行 入力内容・送信時間・送信頻度に不自然な兆候がない投稿
保留 別の確認一覧へ保存し、自動返信は送らないか、確認後まで遅らせる URLが多い、送信が極端に速いなど、確認が必要だが拒否の根拠が弱い投稿
拒否 担当者通知と自動返信を止め、判定確認に必要な最小限のログだけを保存 複数条件に該当する自動送信や、同一内容の大量連投

送信回数制限は、IPだけでなくフォームと時間帯を組み合わせます

同じIPから一定時間内に送信できる回数を制限すると連投を抑えられますが、IPだけでは判断できません。企業、学校、医療機関、ホテルでは共有回線やプロキシを使うことがあり、複数人の正規投稿が同じIPに見えるためです。

フォームID、一定時間内の件数、同一本文、User-Agent、セッション情報などを組み合わせ、最初は保留や待ち時間の追加から始めます。障害連絡や予約変更のように短時間で再送される用途には、上限値や例外条件を別に設定します。

reCAPTCHAは、被害と利用者負担を確認して採用します

reCAPTCHA は有力な選択肢ですが、万能ではありません。フォームの役割と利用者層を見て、使う場所を選んだ方が納得しやすくなります。

見たい点 考え方 補足
スパムの集中度 一般問い合わせのように公開範囲が広いフォームほど優先度が上がりやすくなります。 件数が少ないフォームでは他の軽い対策で足りることもあります。
利用者層 高齢者やスマホ中心の利用者が多い場合は、難しい認証が負担になりやすくなります。 学校や医療ではここを見落としにくい方がよいです。
自動返信の影響 自動返信メールが大量に出ると運用面の影響が大きくなります。 まず自動返信の出し方を見直す選択もあります。

自動返信は、通常受信と判断した投稿だけに送ります

判定前に自動返信すると、存在確認や大量送信に悪用される可能性があります。通常受信だけに返信し、保留は担当者が確認するまで送信せず、拒否した投稿には送信しません。

メール送信処理にも別の安全策を設けます

画面でボットを弾いても、メール送信処理が弱いままだと別の問題が起きやすくなります。特に、利用者の入力値をどこへ使うかは先に整理しておいた方が安全です。

  1. 件名や差出人名に改行を残さない
    ヘッダーに使う値へ改行が入ると、意図しない形でメール処理へ影響することがあります。
  2. 送信先アドレスは入力値で決めない
    送信先はサーバー側で固定し、利用者入力をそのまま宛先に使わない方が安全です。
  3. 添付の条件を先に決める
    拡張子、MIMEタイプ、サイズ、保存期間、閲覧権限を定め、危険なファイルや不要な長期保存を避けます。

ログから対策変更の条件を判断します

通常・保留・拒否の件数と、保留後の確認結果を記録します。拒否した投稿は本文全体を残すのではなく、判定理由、日時、対象フォーム、必要に応じて短期保存する送信元情報などに限定し、保存期間と閲覧権限を決めます。

送信元

フォーム別の送信回数

短時間の偏りを確認します。IPは共有回線やプロキシの影響を受けるため、単独では遮断条件にしません。

判定結果

保留・拒否の件数

対策変更の前後で件数を比較し、特定の判定条件だけが急増していないか確認します。

誤判定

保留後に通常扱いへ戻した割合

通常扱いへ戻す投稿が多ければ条件が厳しすぎます。該当したルールを確認し、閾値を変更します。

通知

自動返信と担当者通知の件数

通常の送信件数との差を確認し、判定前にメールが送られていないか、通知量が急増していないかを調べます。

業種とフォーム用途で判定条件を変えます

どの業種でも、1つの条件だけで白黒を決めないことが重要です。軽い判定を組み合わせ、根拠が弱い投稿は保留で確認します。

まとめ

問い合わせフォームのスパム対策は、強い認証を1つ置けば終わるものではありません。入力内容、送信時間、送信頻度などを組み合わせ、通常受信・保留・拒否の処理を分けることで、正規利用への影響と担当者の確認負担を抑えます。

導入時は、honeypot、送信時間の判定、自動返信の送信条件、保留一覧を先に用意します。保留から通常扱いへ戻した割合を確認し、必要なフォームだけ回数制限や追加認証を強めます。