← 記事一覧へ

フォームとボットのためのレート制限・キュー・アンチスパム

レート制限キューアンチスパムは3層の防御です - これらがないと、フォームや Telegram/Discord ボットはすぐスパム・洪水・DoS の入り口になります。CAPTCHA だけでは足りません。頻度制限、非同期処理、内容と評判のフィルタが必要です。以下 - 余計な複雑さなしに、サイトとボット向けの実務的な構成を組み立てる方法です。

  • レート制限 - 1つの IP・アカウント・トークンから、時間窓あたり何回まで許可するか
  • キュー - 受付と重い処理(メール、CRMLLMwebhook)のあいだのバッファ
  • アンチスパム - honeypot、CAPTCHA、ヒューリスティック、ブロックリスト、内容検査
  • 原則 - まず頻度を切り非同期で処理し、その後フィルタを強化する
  • 目的 - 本物のリードを残し、ボットネット下でもサービスを落とさない

なぜフォームとボットが最初に狙われるか

公開エンドポイントは鍵のかかっていないドアです。スパムボットは /contact/api/lead、ボット webhook を探し、フィッシング、SEO スパム、クレデンシャルスタッフィング、クーポン総当たりを大量送信します。制限がないとメール/SMS/LLM の請求が増え、CRM がゴミで埋まり、本物のリードがノイズに埋もれます。

典型的な症状:

  1. フォームへの POST 急増なのに売上コンバージョンがゼロ
  2. 別 IP から同一文面 - または同一レンジから「一見ユニーク」なゴミ
  3. メールや webhook のキューがプロバイダ上限にぶつかる
  4. メッセンジャーボットの応答が遅くなったりタイムアウトする

レート制限:何をどう制限するか

レート制限は「このエンドポイントを N 秒で何回叩いてよいか」に答えます。制限のキーが重要です。

キー 向いている場面 リスク
IP 匿名フォーム、認証なし webhook NAT や社内網で善良ユーザーを切る
User / chat_id 認証済み API とボット ログイン前は守れない
API トークン / セッション パートナー連携 盗まれたトークンで枠を使い切られる
Fingerprint + IP 厳しいフォーム悪用対策 実装とユーザーへの説明が難しい

実務的な窓:

  • リードフォーム: IP あたり 10 分で成功送信 3-5 回、失敗(検証失敗、CAPTCHA fail)はより厳しく
  • ログイン / OTP: 別枠で厳しめ - でないとブルートフォース
  • ボットコマンド: ユーザーあたり数秒に重い応答(生成・検索)1 回;軽いコマンドは緩め
  • プロセス / ワーカーの全体上限 - キーが違ってもスパイクを防ぐ

超過時:HTTP 429Retry-After;ボットでは短い「N 秒お待ちください」。内部しきい値は明かさない。発火ログを取る:制限が緩すぎる/厳しすぎるかが見えます。

キュー:受付と処理を分ける理由

フォームは同期で CRM 書き込み、PDF 生成、外部 API 呼び出しをすべきではありません。キュー(Redis、RabbitMQ、SQS、Celery、BullMQ)は検証直後にジョブを受け、すぐ「受付済み」を返します。

キューの効果:

  • ピーク平滑化 - スパムやキャンペーンでも Web プロセスを落とさない
  • 失敗時リトライ - リード消失の代わりに backoff 付き retry
  • 優先度 - 有料注文を「PDF ダウンロード」より上に
  • 分離 - LLM/メールワーカーをフロントと別にスケール

フォームの流れ:

  1. CSRF / origin、honeypot、フィールド基本検証
  2. レート制限
  3. DB にリードを queued で保存
  4. キューへ push
  5. ユーザーへ HTTP 200/202
  6. ワーカー:アンチスパムスコア → CRM / メール / 通知

ボットも同様:Telegram の更新は素早く受付;重い応答(RAG、画像、パース)はキューへ。でないと long polling / webhook の遅延が積み上がります。

アンチスパム:一項目ではなく層

reCAPTCHA 一つでは終わりません。多層防御を組んでください。

1. 入口の安いフィルタ

  • Honeypot フィールド(人には隠れ、ボットが埋める)
  • 最短入力時間(速すぎ = ボット)
  • Referer / Origin と CSRF トークン確認
  • ボディサイズと添付数の上限

2. CAPTCHA とチャレンジ

チャレンジはシグナル時に出す:N 回試行後、怪しい IP、高スコア時。常時 CAPTCHA はコンバージョンを傷つける;狙った表示はほぼ傷つけない。

3. 内容と評判

  • 文中のドメイン/URL ブロックリスト
  • 反復テンプレと言語非依存スパムの検出
  • メール検査(MX、使い捨てドメイン)
  • ボット:リンクフィルタ、ストップワード、メディア上限

4. 行動シグナル

履歴:この端末からの送信が何件、購入や意味ある会話になったか。新規 IP が1分で何十件も「buy seo」なら、営業 CRM 直行ではなく隔離か人手レビューへ。

3層をつなぐ順番

本番の推奨順:

  1. 検証と安いアンチスパム(honeypot、サイズ、CSRF)
  2. IP + ユーザー/chat id のレート制限
  3. クライアント / メッセンジャーへの即応答
  4. ワーカーあたり同時ジョブ上限付きキュー
  5. ワーカーでの重いアンチスパムと連携(スコア、CRM、メール)
  6. 429 急増・拒否ジョブ増加のアラート

こうすると、本来レート制限で切るべきリクエストに CPU とプロバイダ費用を浪費しません。

導入チェックリスト

  • [ ] フォームとボットでリスクに応じた別制限がある
  • [ ] 送信メール/SMS/LLM に全体サーキットブレーカがある
  • [ ] 429 とボット文言は人に分かり、回避方法は示さない
  • [ ] キューに DLQ(デッドレター)と長さ監視がある
  • [ ] 怪しいリードは黙って削除せず隔離へ
  • [ ] レート制限・スパムスコアのログが完全な個人情報なしでも使える
  • [ ] 負荷試験:/contact に 100 RPS で何が起きるか

まとめ

レート制限は頻度を切り、キューはバックエンドと連携予算を守り、アンチスパムはゴミとリードを分けます。三つはセットで初めて効きます。制限だけでキューがないと同期ハンドラが落ち、キューだけでフィルタがないと CRM にスパムが広がり、フィルタだけで制限がないと DDoS 下で高コストになります。

フォームとボットの防御をスタックに合わせて設計したい場合(制限、キュー、隔離、監視)- ご連絡ください。サポートと改善の目安は料金ページにあります。

よくある質問

レート制限とアンチスパムの違いは?

レート制限は試行回数を数え、アンチスパムは内容と行動を評価します。 制限は「きれいな」リクエストの洪水も止め、アンチスパムは枠内に収まる稀で有害なスパムを拾います。

リードが少なくてもキューは必要?

外部 API・メール・LLM があるなら必要です。 低トラフィックでも同期 CRM タイムアウトはフォーム UX を壊します。キューはアイドル時は安く、ピークで助かります。

すべてのフォームに CAPTCHA は必須?

いいえ。 リスクに応じたチャレンジがよいです:エラー連続後、悪い IP 評判、異常スコア時。人への妨げを減らしつつボットは切れます。

ボットは chat_id と IP のどちらの制限?

両方です。 chat_id は一ユーザーの洪水を止め、IP/webhook トークンは偽更新とスキャンから守ります。グループは DM より厳しい制限が一般的です。

スパムっぽいリードはどうする?

隔離して人手確認または遅延配信し、痕跡なく捨てないでください。稀な本物リードを失い、攻撃パターンの変化も見えなくなります。

この記事の用語

CRM — Customer Relationship Management — 顧客関係管理

webhook — HTTP callback when an event happens — イベント発生時に飛ぶHTTPコールバック

LLM — Large Language Model — 大規模言語モデル

Celery — Python task queue for background jobs — Pythonのバックグラウンドジョブ用キュー

RAG — Retrieval-Augmented Generation — 検索拡張生成

DDoS — Distributed Denial of Service — 分散型サービス拒否攻撃

お問い合わせ