Honeypot
CAPTCHAを使用せずに、ハニーポットフィールドと時間制限を利用して自動フォーム送信を防ぐスパム対策モジュール。
honeypot
インストール
composer require 'drupal/honeypot:^2.2'
composer require 'drupal/honeypot:^2.1'
概要
Honeypotモジュールは、Drupalサイトのフォームでスパムボットによる送信を防ぐための効果的で目立たない方法を提供します。ユーザー操作を必要とするCAPTCHAとは異なり、Honeypotは2つの補完的な技術を使用してバックグラウンドで見えない形で動作します。
1つ目の技術は、フォームに隠しハニーポットフィールドを追加します。スパムボットは通常すべてのフィールドを埋めるため、実際のユーザーには見えないこの隠しフィールドも入力します。ハニーポットフィールドにデータが含まれる送信はスパムとして拒否されます。
2つ目の技術は、時間ベースの保護を実装します。フォームが読み込まれた時点でタイムスタンプが保存され、人間が可能な速度より速くフォームが送信された場合(設定可能な時間制限)、その送信は拒否されます。スパムボットは通常ほぼ瞬時にフォームを送信するため、これは効果的です。
Honeypotには、繰り返し違反する者に対する指数関数的な時間ペナルティが含まれています。送信に失敗するたびに必要な待機時間が指数関数的に増加し、執拗なボットがフォームを正常に送信することがますます困難になります。
Features
- ハニーポットフィールド保護 - ボットが入力すると拒否をトリガーする隠しフィールドを追加
- 時間ベースのフォーム保護 - フォーム送信が受け入れられる前に最小限の時間を要求
- 失敗した送信履歴に基づく繰り返し違反者への指数関数的な時間ペナルティ
- サイト全体のすべてのフォームを保護、または特定のフォームを個別に選択
- 特定の権限を持つユーザー(管理者など)の保護をバイパス
- 監視と分析のためのブロックされたフォーム送信のログ記録
- スパム拒否に対するカスタムアクションのためのRulesモジュールとのイベント連携
- 設定ガイダンスのためのインタラクティブツアー
- cronによる古い失敗送信レコードの自動クリーンアップ
- 時間保護がアクティブな場合の自動キャッシュ無効化によるページキャッシュ処理
- カスタムフォームに保護を追加するためのプログラマティックAPI
Use Cases
スパムボットからのユーザー登録保護
自動アカウント作成を防ぐためにユーザー登録フォームでHoneypotを有効にします。/admin/config/content/honeypotに移動し、Honeypot有効化フォームの下の「ユーザー登録フォーム」にチェックを入れます。即座に送信するボットをキャッチするために時間制限を5〜10秒に設定します。
サイト全体のフォーム保護
大量のスパム攻撃を受けているサイトでは、「すべてのフォームをHoneypotで保護」を有効にして、すべてのフォームに保護を追加します。時間制限が有効な場合、フォームのあるページでページキャッシュが無効になることに注意してください。システムフォーム、検索フォーム、Viewsの公開フォームは自動的に除外されます。
カスタムフォームへのHoneypot追加
honeypotサービスを使用してカスタムモジュールフォームに保護を追加します。フォームビルダーまたはhook_form_alterで: \Drupal::service('honeypot')->addFormProtection($form, $form_state, ['honeypot', 'time_restriction']); 必要に応じて'honeypot'のみまたは'time_restriction'のみを含めることができます。
スパム試行の監視
「ブロックされたフォーム送信をログに記録」を有効にして、Drupalのログでスパム試行を追跡します。/admin/reports/dblogで'honeypot'でフィルタリングしてログを確認し、スパムパターンを理解し、保護が機能していることを確認します。
Rulesによるスパムへのカスタム対応
Rulesモジュールをインストールし、「フォーム送信の拒否後」イベントに反応するルールを作成します。これを使用してメール通知を送信したり、IPをブロックリストに追加したり、スパム試行に対する他の自動応答をトリガーしたりできます。
管理者の保護バイパスを許可
デフォルトでは、「Honeypot保護をバイパス」権限を持つユーザーはハニーポットチェックの対象外です。テスト中や正当な迅速なフォーム送信中の誤検知を防ぐために、管理者などの信頼されたロールにこの権限を割り当てます。
Tips
- ボットに入力させるために'url'、'homepage'、'link'などの魅力的な要素名を使用してください
- time_limitは5秒から始めて、フォームの複雑さとユーザーフィードバックに基づいて調整してください
- コマースやチェックアウトフォームでは、迅速な購入中の誤検知を避けるために時間保護を無効にすることを検討してください
- 指数関数的な時間ペナルティにより、繰り返し違反者は自動的にますます長い待機時間に直面します
- 他のモジュールのフォームに保護を追加するにはhook_honeypot_form_protections_alterを使用してください
- 有効化後は定期的にログを監視して、正当なユーザーがブロックされていないことを確認してください
- 多層防御のためにHoneypotを他のスパム防止方法と組み合わせてください
Technical Details
Admin Pages 1
/admin/config/content/honeypot
保護方法、時間制限、保護するフォームの選択など、Honeypotスパム防止設定を構成します。このページでは、管理者がサイトのスパム対策動作を細かく調整できます。
権限 2
Hooks 4
hook_honeypot_form_protections_alter
特定のフォームに適用されるハニーポット保護を変更します。特定のフォームの保護タイプを追加または削除するために使用します。
hook_honeypot_add_form_protection
フォームにハニーポット保護が追加された後に反応します。保護されたフォームがいつ表示されるかを追跡するのに便利です。
hook_honeypot_reject
フォーム送信がHoneypotによって拒否されたときに反応します。スパム試行のカスタム処理を可能にします。
hook_honeypot_time_limit
Honeypotの時間制限に追加時間を加えます。制限に追加する秒数の整数を返します。
Troubleshooting 5
シンプルなフォームに対して時間制限が高すぎる可能性があります。/admin/config/content/honeypotでtime_limit設定を減らすか、0に設定して時間ベースの保護を無効にし、ハニーポットフィールドのみをアクティブに保ちます。
時間ベースの保護では、匿名ユーザーのページキャッシュを無効にする必要があります。キャッシュが重要な場合はtime_limitを0に設定するか、フォーム保護オプションから'time_restriction'を削除してハニーポットフィールド保護のみを使用します。
フォームの既存のフィールドと競合しないようにelement_name設定を変更します。一般的な代替案:homepage、link、website_url、contact_url。
time_limitをより高い値(10〜15秒)に増やします。すべてのフォームで保護を有効にすることを検討してください。ハニーポット要素名が高度なボットに認識されていないか確認します。
「Honeypot保護をバイパス」権限を持つユーザーとしてログインしていないことを確認してください。管理者ユーザーはデフォルトで保護をバイパスします。
Security Notes 5
- Honeypotは完全なスパムソリューションではありません。JavaScript対応のボットを持つ決意のある攻撃者は保護をバイパスする可能性があります
- 機密性の高いフォームには、常にHoneypotを他のセキュリティ対策と組み合わせて使用してください
- バイパス権限は高度に信頼されたロールにのみ付与してください
- 失敗した送信ログには攻撃者に関する情報が含まれている可能性があります。定期的に確認してクリアしてください
- Honeypot保護に加えて、サーバーレベルでのレート制限を検討してください