インストール
composer require 'drupal/antibot:^2.0'
概要
Antibotは、革新的な方法でウェブサイト上のロボットによるフォーム送信を排除するために設計された、非常に軽量なモジュールです。このモジュールは完全にバックグラウンドで動作し、エンドユーザーによる操作を一切必要としません。
保護メカニズムは、フォームのアクションを無効なパスに変更し、隠しキーフィールドを挿入することで機能します。JavaScriptが人間らしい動作(マウスの移動、タッチイベント、TabまたはEnterキーの押下)を検知すると、元のフォームアクションを復元し、正しいキー値を設定します。JavaScriptが有効でない場合、または人間らしい動作が検出されない場合、フォーム送信は失敗します。
エンドユーザーに必要な唯一の条件は、JavaScriptが有効になっていることです。無効な場合、保護されたフォームには、フォームを使用するにはJavaScriptが必要である旨のメッセージが表示されます。
Features
- ユーザー操作を必要としない透明なスパム対策保護(CAPTCHAなし)
- マウスの動き、タッチジェスチャー、またはキーボードナビゲーション(Tab/Enter)による人間の動作を検出
- ボットの送信を無効なページ(/antibot)にリダイレクトしてフォームを保護
- フォームIDマッチングのワイルドカードパターンをサポート(例:comment_*ですべてのコメントフォームを保護)
- ワイルドカードにマッチした場合でも、特定のフォームを保護から除外する機能
- ページ上のフォームIDとその保護状態を表示するデバッグモード
- 信頼できるユーザーがAntibot保護をスキップできる権限ベースのバイパス
- 保護設定変更時の適切なキャッシュ無効化
- 個別のWebform保護設定のためのWebformモジュールとの統合
- 他のモジュールが保護状態を変更したり、拒否された送信に応答するためのHook
Use Cases
スパムボットからコメントフォームを保護
デフォルトで、Antibotはパターン「comment_*」を使用してすべてのコメントフォームを保護します。JavaScriptを実行しない、または人間の操作をシミュレートしないスパムボットは、コメントの投稿をブロックされます。これにより、ユーザーにCAPTCHAを解かせることなくコメントスパムを減らすことができます。
自動登録に対してユーザー登録を保護
user_register_formはデフォルトで保護されており、ボットによる自動アカウント作成を防止します。これは、オープン登録を許可しているが、大量の偽アカウント作成を防ぎたいサイトに特に有用です。
ユーザーを煩わせずにお問い合わせフォームを保護
お問い合わせフォーム(contact_message_*)はデフォルトで保護されています。CAPTCHAソリューションとは異なり、ユーザーは人間であることを証明する必要がありません。ページ上で自然に操作する(マウスを動かす、キーボードナビゲーションを使用する)だけで十分です。
カスタムフォームの保護
「フォームIDを表示」オプションを一時的に有効にして、サイト上の任意のカスタムフォームのフォームIDを確認します。次に、そのフォームID(またはワイルドカードパターン)を保護フォームリストに追加します。カスタムWebform送信は「webform_submission_*」のようなパターンを使用して保護できます。
信頼できるユーザーに保護のバイパスを許可
信頼できるロール(管理者やコンテンツ編集者など)に「Antibotをスキップ」権限を割り当てることで、Antibotバリデーションなしでフォームを送信できるようになります。これは自動テストや、マウス/キーボードイベントをトリガーしないアクセシビリティツールを使用するユーザーに便利です。
きめ細かいフォーム保護制御
excluded_form_ids設定を使用して、ワイルドカードパターンにマッチした場合でも特定のフォームを保護から除外できます。例えば、「contact_message_*」ですべてのお問い合わせフォームを保護しつつ、除外リストに「contact_message_newsletter」を追加して特定のフォームを除外できます。
Webformモジュールとの統合
Webformモジュールがインストールされている場合、個別のWebformのサードパーティ設定からAntibot保護を有効にできます。モジュールはWebform設定が保存されるときにform_ids設定を自動的に管理します。
Tips
- ワイルドカードパターン(例:「comment_*」)を使用して、個別にリストする代わりに、単一のエントリで複数の関連フォームを保護できます
- 「フォームIDを表示」は保護を設定する際にのみ一時的に有効にしてください。本番環境で有効のままにすると、内部のフォームIDが露出する可能性があります
- 「Antibotをスキップ」権限は、JavaScriptの操作をシミュレートできない自動テスト環境に便利です
- AntibotはHoneypotなどの他のスパム対策モジュールと組み合わせて、多層防御に使用するとうまく機能します
- Views exposed formsには特別な処理があり、保護できますが、ユーザー操作前の初回ページ読み込み時にも動作します
- 保護されたフォームには「antibot」CSSクラスが追加されるため、必要に応じてカスタムスタイリングに使用できます
Technical Details
Admin Pages 1
/admin/config/user-interface/antibot
Antibotによって保護されるフォームを設定し、フォームIDを識別するためのデバッグモードを有効化します。このページでは、管理者がワイルドカードを使用してフォームIDパターンを指定し、一度に複数のフォームを保護したり、特定のフォームを保護から除外したり、ページ上にフォームIDを表示するデバッグモードを有効にしたりできます。
権限 2
Hooks 3
hook_antibot_form_status_alter
モジュールが特定のフォームをAntibotで保護すべきかどうかを変更できるようにします。フォームIDが設定されたパターンとマッチした後に呼び出されます。
hook_antibot_reject
フォーム送信の拒否に対応します。Antibotがantibotキーの欠落または無効(ボット動作の検出)によりフォーム送信をブロックしたときに呼び出されます。
hook_antibot_generate_key_alter
フォームバリデーション用に生成された暗号化キーを変更します。モジュールがキー生成プロセスをカスタマイズできるようにします。
Troubleshooting 5
ユーザーのブラウザでJavaScriptが有効になっていることを確認してください。アクセシビリティツールや自動化を使用している場合は、影響を受けるユーザーに「Antibotをスキップ」権限を付与することを検討してください。
カスタムフォームテンプレートにantibotフィールドを追加してください:{{ element.antibot_no_js }}と{% if element.antibot_key %}{{ element.antibot_key }}{% endif %}。antibot_keyの条件チェックにより、フィールドの重複レンダリングを防ぎます。
高度なボットの中にはJavaScriptを実行し、マウスイベントをシミュレートできるものがあります。価値の高いフォームには、AntibotをHoneypotやreCAPTCHAなどの他のスパム対策と組み合わせることを検討してください。
Antibot設定で「フォームIDを表示」チェックボックスを有効にしてください。その後、フォームを含むページにアクセスすると、フォームIDとその保護状態がメッセージとして表示されます。フォームIDを特定したら、このオプションを無効にすることを忘れないでください。
モジュールには適切なキャッシュタグ処理が含まれています。キャッシング問題が発生した場合は、Drush(drush cr)またはパフォーマンス設定ページからすべてのキャッシュをクリアしてみてください。
Security Notes 5
- antibotキーはサイトのハッシュソルトを使用したDrupalの暗号化HMAC関数を使用して生成されるため、予測攻撃に対して安全です
- キーはブラウザに送信される前にシャッフルされ、JavaScriptによってアンシャッフルされるため、追加の難読化レイヤーが加わります
- JavaScriptがないフォームは/antibotエンドポイントにフォールバックし、エラーを表示しますが、機密情報は公開されません
- プログラムで送信されたフォーム(FormState::setProgrammed()を使用)はAntibotバリデーションをバイパスし、正当な自動フォーム送信を許可します
- このモジュールはユーザーデータや追跡情報を保存しません。送信時にフォーム送信を検証するだけです