PukiWiki1.5.2用スパムフィルタをreCAPTCHAに対応!メールフォームをさらに強化!

PukiWiki1.5.2用スパムフィルタをreCAPTCHAに対応!メールフォームをさらに強化!

PukiWiki1.5.2用スパムフィルタspam_filter.phpAkismetを利用してメールフォームのスパム対策をしたが、よせばいいのに「reCAPTCHAもテストしてスパムフィルタを万全にしよう!」と思い立ったので、今回はspam_filter.phpreCAPTCHAに対応させ、メールフォームをさらに(無駄に?)強化してみた。
前回の記事と同様にサブドメインを連番で用意してあるので、今回はmuseum-07サブドメインの内容をmuseum-08サブドメインにコピーして検証し、さらにmuseum-08サブドメインの内容をmuseum-09サブドメインにコピーして検証しつつ、作業を進めた。

※2019/12/03追記
レスポンシブデザインに対応した最新のスパムフィルタ対応メールフォームプラグインに関しては、次の記事を参照のこと。

なぜreCAPTCHAに対応させようと思ったのか?

元々私がやろうとしているWikiは私だけがページの作成・更新をするのを主眼として進めているが、より汎用性を持たせるためには「最新のreCAPTCHAにも対応しないとダメだろう」と、気まぐれなスケベ心高邁な精神から対応を決断した。
私のように「Akismetで十分」と考える人がいる一方で、「reCAPTCHAで十分」と考える人もいるし、「AkismetreCAPTCHAの両方必要」と考える人もいるだろう。
私の場合はFacebookコメントを導入するが、従来のコメントプラグインを使いたい人もいるだろうし、従来のコメントプラグインを拡張したい人もいるだろう(私は対応しないが、やりたい人は自力で頑張って欲しい)。
要するに「要求仕様は人それぞれ」なのだから、より広範囲にカバー出来た方がPukiWikiを利用する人にとって等しく利益があるワケだ。ならば、やるしかあるまい?
前回の記事ではspam_filter.php一式PukiWiki1.5.2に対応させ、さらにpkwkmail.inc.phpプラグインAkismetに対応させたが、今回はspam_filter.phpにreCAPTCHA v2とv3に対応させると共に、pkwkmail.inc.phpプラグインにも手を入れる必要があった。
本稿で改造箇所の説明をイチイチやるのもナンだし面倒なので、PukiWiki1.5.2用スパムフィルタspam_filter.phpを更新して本サイトのダウンロードページにアップロードし直した。まだダウンロードしていない人はダウンロードして使って欲しい。

繰り返しになるがPukiWiki1.5.2用に作ってあるので、そのままフォルダとファイルをFTPする。パーミッションは次の通り設定する。

  • 755:「Net」「DNS」「RR」フォルダ
  • 777:「spam_filter」フォルダ・dns_get_ns.cacheファイル
  • 644:その他のファイル

※「spam_filter」フォルダはspam_filter.phpでスパム認定した際にログを保存するフォルダとして新設し、スパムログを吐くようにspam_filter.phpを改造してある

スパムフィルタspam_filter.php対応メールフォーム

reCAPTCHA v2およびv3に対応したPukiWiki1.5.2用スパムフィルタspam_filter.php対応のメールフォーム、pkwkmail.inc.phpプラグインダウンロードページに公開した。こちらは特に設定や修正は必要ないが、サーバにアップロードする際のファイル名は「pkwkmail.inc.php」にする必要がある。reCAPTCHA v2とv3とで対応したpkwkmail.inc.phpプラグインを分けており、v2とv3の混在での使用は想定していない

ダウンロードページからプラグインをダウンロードし、ローカルの作業フォルダに解凍する。
以降、reCAPTCHAのv2およびv3対応メールフォームの設定について説明するが、前提としてPukiWiki1.5.2用スパムフィルタspam_filter.php一式がサーバに導入済みで、PukiWiki「お問い合わせ」ページが作成済みであることとする(前回の記事参照)。なお、利用したいreCAPTCHAに合わせて適宜目的のメールフォームの設定をして欲しい。

reCAPTCHA v2対応メールフォームの設定

ここではAkismetreCAPTCHA v2に対応したメールフォームの設定を説明する。
まず、Googleアカウントにログインしておき、次のサイトでreCAPTCHA v2用のサイトキーとシークレットキーを取得する。

ラベルは識別のために必要なので何でも良いが、ここではドメイン名と同一にした
reCAPTCHA v2」を選択し、「私はロボットではありません」を選択する
ドメインはPukiWikiを設置するドメイン名を入力する
reCAPTCHA利用条件に同意する」にチェック

画面をスクロールすると「送信」ボタンがあるのでクリックする。

図のように①サイトキー②シークレットキーが発行されるので、後ほどspam_filter.phpにコピー&ペーストして設定する。

先ほどダウンロードした「pkwkmail_recaptcha_v2.inc.php」ファイルを「pkwkmail.inc.php」のファイル名でサーバの「plugin」フォルダへFTPし、パーミッションを「644」に変更しておく。
次に「lib」フォルダのspam_filter.phpを修正して設定をする。まずは62行目付近のフィルタを設定しよう。ここではAkismetreCAPTCHAの両方を設定する。

lib\spam_filter.php

// ※上記条件にメールフォームでreCAPTCHAを指定する場合
//define('SPAM_FILTER_COND', ''#useragent() or #filename() or #atag() or (#onlyeng() and #urlnum()) or #urlnsbl() or (#onlyeng() and #url() and #akismet()) or #recaptcha()');
// ※デフォルトではフィルタなし
define('SPAM_FILTER_COND', '#akismet() or #recaptcha()');

次にAkismetの設定をしておく。具体的にはspam_filter.phpの311行目付近を修正する。

lib\spam_filter.php

//// akismet   - Akismet によるフィルタ
// スパムチェック時には無視するPostデータ。カンマ区切り
define('SPAM_FILTER_AKISMET_IGNORE_KEY', 'digest');
// Akismetで取得する。APIキー
define('SPAM_FILTER_AKISMET_API_KEY', 'APIキー');
define('SPAM_FILTER_AKISMET_PLUGIN_NAME', 'edit,article,pkwkmail');

AkismetのAPIキーの取得や設定は前回の記事を参照のこと

次にreCAPTCHAの設定をする。具体的にはspam_filter.phpの316行目付近を修正する。

lib\spam_filter.php

//// reCAPTCHA の設定
// reCAPTCHA種別('v2'または'v3'それ以外はreCAPTCHAを実行しない)
define('SPAM_FILTER_RECAPTCHA_CHECK', 'v2');
// Bot識別スコア閾(しきい)値(0.5がBotと人間の閾値でスコアが低いほどBot)
define('SPAM_FILTER_RECAPTCHA_THRESHOLD', '0.5');
// reCAPTCHAを実行するプラグイン(例:'edit,article,pkwkmail')
define('SPAM_FILTER_RECAPTCHA_PLUGIN_NAME', 'edit,article,pkwkmail');
// サイトキー
define('SPAM_FILTER_RECAPTCHA_SITEKEY', 'サイトキー');
// シークレットキー
define('SPAM_FILTER_RECAPTCHA_SECRETKEY', 'シークレットキー');

reCAPTCHA v2の設定なので、reCAPTCHA種別を「v2」とし、先ほど発行した①サイトキー②シークレットキーをコピー&ペーストする。reCAPTCHAを実行するプラグインはメールフォームのpkwkmail.inc.phpなので「pkwkmail」を設定する。
なお、reCAPTCHA v2ではサイトの訪問者が「私はロボットではありません」ということを証明するので、「Bot識別スコア閾(しきい)値」は設定してもしなくても良い(設定は無視する)
ファイルの修正が完了したら、「lib」フォルダにFTPしておく。実際にmuseum-08サブドメインを検証用に使ったので見てみよう。

図のように「お問い合わせ」ページを開くと、私はロボットではありません」のチェックボックスが表示され、内容確認」のボタンがクリック出来ない状態になる。これは「私はロボットではありません」がチェック状態でないと「内容確認」のボタンがクリック出来ないようにしている(デバッグテストでは「私はロボットではありません」をチェック状態にしないまま「内容確認」ボタンをクリックし、ちゃんとエラーで弾くことを確認している)。

図のように「私はロボットではありません」のチェックボックスをクリックすると、よく見かける画像を選択する画面が表示され、人間が画像を見て正しく画像を選択しないと先に進めないようになっている。

一度「私はロボットではありません」をクリアしても一定時間何も操作しないで経過すると自動的にリセットがかかり、図のような表示になる。
これでロボットによるスパム攻撃はかわせるだろうし、人間がロボットではない証明をしてもAkismetによるスパム投稿チェックがかかるので、どのみちスパム投稿が出来ないようになっている。

reCAPTCHA v3対応メールフォームの設定

ここではAkismetreCAPTCHA v3に対応したメールフォームの設定を説明する。
まず、Googleアカウントにログインしておき、次のサイトでreCAPTCHA v3用のサイトキーとシークレットキーを取得する(reCAPTCHA v2用とは別に発行される)。

ラベルは識別のために必要なので何でも良いが、ここではドメイン名と同一にした
reCAPTCHA v3」を選択する
ドメインはPukiWikiを設置するドメイン名を入力する
reCAPTCHA利用条件に同意する」にチェック

画面をスクロールすると「送信」ボタンがあるのでクリックする。

図のように①サイトキー②シークレットキーが発行されるので、後ほどspam_filter.phpにコピー&ペーストして設定する。

先ほどダウンロードした「pkwkmail_recaptcha_v3.inc.php」ファイルを「pkwkmail.inc.php」のファイル名でサーバの「plugin」フォルダへFTPし、パーミッションを「644」に変更しておく。
次に「lib」フォルダのspam_filter.phpを修正して設定をする。まずは62行目付近のフィルタを設定しよう。ここではAkismetreCAPTCHAの両方を設定する。

lib\spam_filter.php

// ※上記条件にメールフォームでreCAPTCHAを指定する場合
//define('SPAM_FILTER_COND', ''#useragent() or #filename() or #atag() or (#onlyeng() and #urlnum()) or #urlnsbl() or (#onlyeng() and #url() and #akismet()) or #recaptcha()');
// ※デフォルトではフィルタなし
define('SPAM_FILTER_COND', '#akismet() or #recaptcha()');

次にAkismetの設定をしておく。具体的にはspam_filter.phpの311行目付近を修正する。

lib\spam_filter.php

//// akismet   - Akismet によるフィルタ
// スパムチェック時には無視するPostデータ。カンマ区切り
define('SPAM_FILTER_AKISMET_IGNORE_KEY', 'digest');
// Akismetで取得する。APIキー
define('SPAM_FILTER_AKISMET_API_KEY', 'APIキー');
define('SPAM_FILTER_AKISMET_PLUGIN_NAME', 'edit,article,pkwkmail');

AkismetのAPIキーの取得や設定は前回の記事を参照のこと

次にreCAPTCHAの設定をする。具体的にはspam_filter.phpの316行目付近を修正する。

lib\spam_filter.php

//// reCAPTCHA の設定
// reCAPTCHA種別('v2'または'v3'それ以外はreCAPTCHAを実行しない)
define('SPAM_FILTER_RECAPTCHA_CHECK', 'v3');
// Bot識別スコア閾(しきい)値(0.5がBotと人間の閾値でスコアが低いほどBot)
define('SPAM_FILTER_RECAPTCHA_THRESHOLD', '0.5');
// reCAPTCHAを実行するプラグイン(例:'edit,article,pkwkmail')
define('SPAM_FILTER_RECAPTCHA_PLUGIN_NAME', 'edit,article,pkwkmail');
// サイトキー
define('SPAM_FILTER_RECAPTCHA_SITEKEY', 'サイトキー');
// シークレットキー
define('SPAM_FILTER_RECAPTCHA_SECRETKEY', 'シークレットキー');

reCAPTCHA v3の設定なので、reCAPTCHA種別を「v3」とし、先ほど発行した①サイトキー②シークレットキーをコピー&ペーストする。reCAPTCHAを実行するプラグインはメールフォームのpkwkmail.inc.phpなので「pkwkmail」を設定する。
reCAPTCHA v3ではサイト訪問者のページ内での行動をスコアとして算出してBotを判別するというもので、本スパムフィルタでは「Bot識別スコア閾(しきい)値」未満のスコアがサーバから返却されたら「Bot」とみなす(エラーで弾く)処理をしている。サイトの訪問者が多ければ多いほど訪問者の動きを自動学習するので算出されるスコアの精度が高くなるが、開設したばかりのサイトではどうなのか?は今のところ良く分かっていない。なので、「Bot識別スコア閾(しきい)値」はしばらくサイトを運用してみないと最適値は出ないというデメリットがある。
ファイルの修正が完了したら、「lib」フォルダにFTPしておく。実際にmuseum-09サブドメインを検証用に使ったので見てみよう。

分かりにくいが、図のように「お問い合わせ」ページを開くと図の右下に「reCAPTCHA」のアイコンが表示されており、マウスをアイコンに重ねると横長に「reCAPTCHAで保護されています」と表示される。
色々なケースでデバッグテストをしてみたが、どうやってもスコアが「0.9」しか出せず、わざわざこのテストのためだけにスパムBotを作成して攻撃させるのもアレなので、「うん、大丈夫!」ってことにした。(;´Д`)
仮にreCAPTCHA v3のBot判定が甘くて突破されたとしても、Akismetによるスパム投稿チェックがかかるので、どのみちスパム投稿が出来ないようになっている。

reCAPTCHAはどちらを設定すべきか?

reCAPTCHA v3はまだ新しい技術だし、どこまで「Google神を信じるか?」にもよるが、reCAPTCHA v2の画像による認証にイライラした経験を持つ人は多いだろう。それ以前のreCAPTCHAによる「歪んだ文字」の判読・入力に比べれば遥かにマシにはなったものの、粗い上に小さな画像で判別が付きにくいケースもあるから、現時点でreCAPTCHA v2とv3のどちらが良いか?は断言できない。また、GoogleもreCAPTCHA v3のリリースを理由にv2を直ちに廃止することもないようだ。
v2とv3のどちらを設定するかだが、(Akismetも入っているから無理にreCAPTCHAを導入しなくても良い、という判断もアリだとは思うが)こればかりはこれは個人の好みなので、好きに設定して貰えれば良いと思う。この記事を掲載している以上、museum-08サブドメインreCAPTCHA v2)とmuseum-09サブドメインreCAPTCHA v3)を検証用に公開し続けるので、色々といじって検討してみて欲しい(私には一切メールが飛ばないようにしてあるので大丈夫)。
ちなみにreCAPTCHAをかけたくない場合はspam_filter.phpファイルで

  • 「SPAM_FILTER_COND」に「recaptcha()」を含めない
  • 「SPAM_FILTER_RECAPTCHA_CHECK」を設定しない(「”」にしておく)
  • 「SPAM_FILTER_RECAPTCHA_PLUGIN_NAME」にプラグインを設定しない

のいずれかを設定すればreCAPTCHAを無効にすることが可能だ。
まだまだPukiWikiは改造しないとダメなので、今後の記事としてはreCAPTCHA v3を採用して進めることにする予定だ。

スパムフィルタのログについて

ルートの「spam_filter」フォルダに日付別に自動でファイルを作成し、スパム認定して弾いたログを吐くようにしている。

これはreCAPTCHA v2のデバッグテスト時のログだが、左から

  1. 日付
  2. 時間
  3. IPアドレス
  4. ホスト名
  5. スパム投稿ページ名
  6. スパム種類

を記録している(項目間はタブ文字区切り)。
と言っても、私がテストしたのはAkismetreCAPTCHAだけなので、他のフィルタが正常に動作するか?はちょっと分からない(無責任)。
spam_filter.phpが持つ他のフィルタをテストするにせよ、そのまま実運用するにせよ(無謀)、スパムログがあれば後から色々と追いかけることが可能だ。プログラムのデバッグにも役立つし、無いと困るがあれば何かの役には立つと思う。ログの削除は手動でオナシャス

おわりに

spam_filter.phpに関して言うと、私の個人的なWikiサイトとしては(スパム対策要件として実質メールフォームだけだし)かなりオーバースペックなスパムフィルタで、労力と時間をかけ過ぎた嫌いがある。が、AkismetreCAPTCHAはメールフォーム以外にもWikiのスパムフィルタとして当たり前だが応用が利くので、それだけ強力なモノにした自負はある。本当は色々とテストして検証しなければならないが、あいにくコレばっかりやってるほどヒマではないので、ある程度の完成度でご勘弁願いたい。
無論、何かしらの不具合やバグ等があれば、お知らせいただけると有り難い。

 

 

この記事が気に入ったら
いいね ! をお願いします


PukiWikiカテゴリの最新記事