こんにちは。プログラマーの山中です。
すっかり稲刈りのシーズンとなりましたが皆様いかがお過ごしでしょうか。この時期は風邪をひきやすいので、今年は温かいお風呂にしっかり浸かる、ちゃんと栄養のあるものを食べる、などをして対策しております。幸い、弊社スタッフに風邪をひいている者はおりませんが、みなさまお気をつけくださいね。
さて、今回はスパム対策用のモジュール Honeypot モジュールのご紹介です。
Honeypot モジュール 概要
Honeypot モジュールでは、ユーザーには見えない隠しフィールドを用意して、スパムにわざと入力させることでスパム判定を行っており(後ほど図で説明します)、さらに入力から送信までが早すぎたらスパムと判定する(デフォルトでは5秒に設定されていますが、この秒数は管理画面から変更可能です)、と2つのアプローチでスパム対策を行っています。この2つの方法の大きな特徴としては ユーザーが特別な動作をすることなくスパム対策を行えること でしょう。
弊社では スパム対策として Mollom モジュール( 弊社紹介記事 ) を使用することが多かったのですが、 Mollom のサービスは 2018年4月2日 からサポートと更新が停止され、その代わりとして Honeypot モジュールや reCaptcha モジュールの使用が推奨されており、 CAPTCHA と合わせて今後より多く導入されるモジュールのひとつになりそうです。
参考リンク: Mollom End-of-Life Announcement | Mollom
Honeypot の仕組み
たとえば、こちらの画像は Drupal のユーザー登録フォームとHTMLソースコードを一緒に表示したキャプチャ画像ですが、 url-textfield
のクラスを持つフィールドがインラインスタイルシートで非表示にされているのがわかりますでしょうか?
こうすることで人間がブラウザからページを表示する際には見えなくなるのですが、通常スパム bot はスタイルシートは解析せずに HTML のみを解析し、入力フォームがあれば全て入力を試そうとすることが多いのでスパムだけがひっかかってしまう、という仕組みなんですね。
ちなみに、ブラウザ上で Honeypot で生成された隠しフィールドに意図的に入力して送信すると、下記のエラーメッセージが出て送信することができませんでした。
では次は導入方法です。
Honeypot モジュール の導入方法
Honeypot モジュールをインストール後、下記ページにアクセスします。
ホーム » 管理 » 環境設定 » コンテンツ作成 » Honeypot configuration
パス: admin/config/content/honeypot
ここで有効にするフォームを選択して Honeypot を有効化しましょう。
なお、この画面では下記の設定を行うことができます。
- 全てのフォームで Honeypot を有効にする
- スパム判定され、ブロックされた送信をログに送信
- Honeypot で使用する要素名
- デフォルトでは
url
になっているため、Honeypot を使用するフォームでurl
というフォーム部品を作成する場合は名前が被らないように変更する必要があります。
- デフォルトでは
- 時間制限
- 0秒に設定すると無効化されます。 ページ内にこの機能がついたフォームがある場合はページキャッシュが無効になります
- Honeypot を有効にするフォーム
- ユーザー登録フォーム
- ユーザーパスワードリセットフォーム
- Contact フォーム
- ユーザーごとの Contact フォーム
- Node の コンテンツタイプごとのフォーム
- コメントフォーム
Webform で Honeypot を有効化する
全ての Webform に対して Honeypot を有効化する場合は下記ページにアクセスします。
ホーム » 管理 » サイト構築 » ウェブフォーム » Webforms: Settings » Webforms: Third party settings
パス: admin/structure/webform/settings/third-party
ここでは下記の設定を行うことができます。
- Honeypot の使用(隠しフィールドの設置)
- 時間制限の追加
なお、個別の Webform モジュールでも下記ページから個別に設定することができます。設定できる項目は Webform 全体の設定画面と一緒です。(*** は個別の Webform の システム内部名称です)
パス: admin/structure/webform/manage/***/third-party-settings
次にカスタムモジュールなどで作成したフォームへの Honeypot の追加方法も記述します。
独自のフォームへの Honeypot の導入
独自のフォームや、独自のモジュールの hook_form_alter
を使用してフォームに追加する場合、 フォームビルダー関数内(または hook_form_alter
内)で下記関数を呼び出します。
honeypot_add_form_protection($form, $form_state,['honeypot', 'time_restriction']);
Honeypot の使用、あるいは時間制限の使用の 有効/無効 を設定するには第3引数の配列にそれぞれの単語を指定すれば OK です。
最後に
ユーザーにストレスを与えることなくスパム対策ができる Honeypot モジュール。
この Umi->d のサイトにも運用の途中で Honeypot モジュールを導入しましたが、ほとんどのスパムを防ぐことができるようになりましたし、設定方法も簡単なので、とりあえず導入して間違いないモジュールのひとつかと思います。ぜひインストールしてみてください。
募集しています
スタジオ・ウミは「Drupal」に特化したサービスを提供する Drupal のエキスパートチーム。
フルリモート&フレックス制だから、働く場所を選ばず時間の使い方も自由です。
そんなワークライフバランスの整った環境で、当ブログに書かれているような
様々な技術を共に学びながら、Drupalサイト開発に携わってみたい方を募集しています。
まずはお話だけでも大歓迎!ぜひお気軽にご連絡ください。