続 perl で CAPTCHA 認証(セキュリティ画像)をやる方法について
さて、前回の perl で CAPTCHA 認証(セキュリティ画像)をやる方法について の続きです。
perl 上級者であれば Catalyst / Sledge / CGI::Application とかを使ってアプリ書いてることも多いと思うので、 CAPTCHA を扱う際には Catalyst::Plugin::Captcha や Sledge::Plugin::Captcha や CGI::Application::Plugin::CAPTCHA を既に使っていることでしょう。言い換えると CAPTCHA の仕組みを導入したいなぁ〜と考えていて、かつ Catalyst / Sledge / CGI::Application を使っているなら上記モジュールを使えば取りあえず CAPTCHA の仕組みを簡単に導入できると言うことになりますね。
その他にも Authen::PluggableCaptcha なんてモジュールもあります。
こちらは CAPTCHA 周りを扱うためのフレームワークとして実装されているので、認証画像の表示〜入力値チェックまで一通りできるようなのです。セキュリティ周りにも結構気を遣った実装になっている・・・気がしました。流し読み程度ですが。・・・がソースが長いし、現状 GD::SecurityImage で事足りているのでこれ以上深追いしません。日本語の情報もほとんどないので初めはアレコレ悩みそうな予感です。
さて、GD::SecurityImage ではキャプチャ画像の生成・表示は実装されているが、認証周りはユーザにゆだねられているとお話しをしましたが、概ね下記のような実装をすればキャプチャ認証を一通り組み込むことができると思います。ちなみに、このシーケンス図はセッション管理しているシステムでの流れになります。キャプチャ画像に表示されている文字はユーザ環境と離れたセッションDBで管理されているのでセキュリティ上でも安全です。
セッション管理していないシステムの場合は、キャプチャ画像を表示する際に、 cookie でキャプチャ画像に表示されている文字を管理することになるでしょう。その場合はユーザ環境側にデータを持つことになるので、当然ながら何らかのアルゴリズムで暗号化した暗号化文字列を cookie として保持するように実装しなければなりません。シーケンス図で書くとこんな感じ。勢いで書いたので見落としあるかもしれませんけど・・・(^^ゞ
とここまで書きながら、なんなんですけど、CAPTCHA について語るには賞味期限がやや過ぎている感が否めません。今から CAPTCHA の仕組みを導入しようと考えている方は、ここら辺も参考にされると宜しいかと思います。昨今は CAPTCHA 解析技術も向上して、ちょっとした画像だと容易に解読されてしまうって話です。それにちなんで、キャプチャ画像のフォント色と背景色ですが、少なくとも同系色もしくは色はランダムで文字毎に変更したりするのがベターと思います。万が一、背景が黒。フォントが赤とかであれば、色属性の R だけでフィルタすると文字だけを抽出なんて容易にできてしまうわけですから。
- はてなのCAPTCHAは簡単に破れる
- 変形文字「CAPTCHA」はもう無意味? - ITmedia エンタープライズ
- CAPTCHAは愚策:江島健太郎 / Kenn's Clairvoyance - CNET Japan
- CAPTCHAよりも優れた日本向けスパム対策
- CAPTCHA認証破りの手口:ITpro
ちなみに、最近とあるサービスのユーザ登録をアフィリエイト使って募集したのですが、隣の大きな国から bot ではなく人力での大量登録に悩まされました。人力なのでアルファベット CAPTCHA は無意味です。国内からは同様の手口は検出されませんでした。そういう意味では、CAPTCHA の文字をカナでやると幸せになれそうな気がします。perl での実装は見あたらなかったのですが、php だとそれなりにモジュールがあるみたいですね。perl 版を実装しようと一瞬思ったわけですが、その他の仕事がどっちゃり振ってきたのでまた気が向いたときにでも・・・いつだそれ??・・・
コメントやシェアをお願いします!