コメント(0)はじめにこのような鄙のブログの記事にコメントを寄せる奇特な方は滅多におられないものの、ロボットによるスパムコメントは時折やってくる。V1を長年利用してきた。V1のサービスを2018年3月末で終了するのでV2以上にアップデートするように」とのメールが届いた。確かに今頃文字入力による認証というのも古めかしい。AIによる画像認識技術の進歩により、容易に突破されてしまうという話も聞く。そこで遅ればせながら、新しいreCAPTCHAを実装してみることにした。reCAPTCHAの二通りが使われているらしい。Type用のプラグインを公開しているページもある。タイル選択方式というインターフェース上の違いがあるだけで、テンプレートへの追記内容はほぼ同じである。タグを追加した位置にreCAPTCHAが表示される。V2の場合だと以下のようになる。reCAPTCHAなる新しいバージョンが公開されたとのこと。何でもGoogle独自のアルゴリズムで投稿者が人間かロボットかを判定するとの触れ込みだ。reCAPTCHAにアップデートしてみることにした。Webで検索してみると、日本語の情報はまだ少ないが、海外のサイトには動作の仕組みと具体的な実装方法について詳細に解説したページが数多く存在している。Website"は、ステップ・バイ・ステップの説明でとても判り易かった。reCAPTCHAでは、投稿ボタンそのものに属性を追加することにより実装する方式に変更されていることがわかる。そのため、V1/2用のプラグインは、そのままでは利用できない。当初は、真面目に新たなプラグインを開発することを検討したのだが、"quick-and-dirty"を生活信条とする私の性格上、今更Perlで新規にコーディングするのが面倒臭くなった。Perl"というほとんどそのまま利用できるコードが掲載されているページがあったので、参考にさせてもらうことにした。以下、備忘録としてテンプレート修正の手順とサーバー側CGIの改造内容について記載しておく。TypeのCGIそのものにも手を加えています。Apart社のサポート対象外となりますので、改造するに当たっては、あくまで自己責任でお願いします。改造の結果、発生する可能性がある総ての不具合、損失、データの破損、消失等について当方は一切の責任を負わないことを予めご承知おき願います。Typeの管理画面から、ヘッダー・テンプレートとコメント入力フォーム・テンプレートに以下の追記、修正を行う。Website"を参照のこと。reCAPTCHAの認証キーの取得は、GoogleのreCAPTCHAサイトから行う。」と揃える必要があることに注意。以上でフロントエンド側の追加・修正は完了したので、次にバックエンド側のCGIに手を加える。」で、これは上記コメント入力フォーム・テンプレートにおいてformのaction属性に指定されている<$MTCGIPath$><$MTCommentScript$>の参照先である。このCGIは、コメント処理の本体プログラムをuseにより読み込むだけの機能しか有していない。デフォルトのCGIの末尾にあるuse部分(L10、L11)をコメントアウトする。Perl"を参考にして作成した以下のコードを追加する。L40、L44において、reCAPTCHAサイトとの接続失敗や認証失敗が発生した場合には、エラーページに遷移するようにしているので、そのURLを適宜修正すること。設定->コミュニケーション->CAPTCHAプロバイダを「なし」にする。reCAPTCHAのdata-badgeが表示されコメントが投稿できれば成功。reCAPTCHAは、一つのform内では単一ボタンにしか紐付けられないようなので、コメント入力フォーム・テンプレートの確認ボタンを削除している(残しておいても認証エラーとなる)。Perlの追加コードを工夫すればなんとかなりそうだが、今のところはこれで良しとする。useによるモジュール読み込みを、reCAPTCHA認証後まで遅延させることにある。Typeのモジュール(MT::Bootstrap)は、読み込み直後に自動実行されるので、認証とは関係なく無条件でコメントを受け付けてしまうからだ。より評価・実行するという実にストレートなものである。evalブロックを用いてuseしても無駄。CGIがロードされた時点で、コードのどの部分にあろうとuseによる読み込みが行われてしまうためである。Typeのバージョンアップ時の対応が厄介になると予想される。その点、mt-comment.cgiは、単なる「バッチファイル」なので、切り分けが容易だ。Typeのバージョンにも依存しない。」の挙動については、このサーバー環境ではJSONモジュールが使えないので未確認である。無いということをどこかで聞いた憶えがあるのだが...。」がうまくやってくれるのだろう。JSONモジュールが使えない場合このブログのレンタルサーバーでは、JSONモジュールが使えないので、追加コードのL34以降を以下のように変更して対応している。JSONを単一の文字列にして連想配列を作るという些か荒っぽい方法だが、Googleから受け取るJSONは極めて単純なので実用上はこれで十分だ。page.}この場合、L15のJSONモジュールの読み込みもコメントアウトまたは削除すること。そのままだとCGIロード時にエラーとなるので念のため。」に置換しているのは、以下に示すようにJSONの中にタイムスタンプが含まれており、これがキーの末尾のコロンと重複するのを避けるためである。"www.minimalvideo.com"}おまけスパムコメントが認証に失敗した場合にGoogleから受け取るJSONは以下の通り。」の値が間違っているか欠落していることが原因の一つだ。reCAPTCHAを配置している時に気付いた。実施した後、CGIの中にアクセスログ機能を設置して経過を観察してみた。約一週間で20件ほどのスパムコメントがあったが、総て防御できていた。当ブログの環境下では十分な効果を発揮しているようだ。Perlというのもある(雀を撃つのに大砲を使うようなところもあるが)。Proこのブログはクリエイティブ・コモンズでライセンスされています。