その他
    ホーム 技術発信 DoRuby ruby on railsでCAPTCHA(画像認証)を実装する。 simple_captcha編

    ruby on railsでCAPTCHA(画像認証)を実装する。 simple_captcha編

    この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

    こんにちは、KBMJの中平@railsエンジニアです。

    今回はruby on railsでCAPTCHA(画像認証)を利用する方法です。
     * CAPTCHA(画像認証)とはgoogleやyahooなど会員登録をするときに表示される、ぐにゃぐにゃした文字の画像です。

    CAPTCHAを実装するのはjavascriptとかrubyのプラグインも色々ありますが、

    今回は ruby on railsプラグインのsimple_captchaを使用してみます。

     simple_captchaの特徴

    •    画像スタイルを選べる(ランダムも可能)
    •     認証する文字はアルファベットか数字かを選べる
    •   3レベルの画像の複雑さ(文字のぐにゃぐにゃ度合い)
    •     画像と文字はDB管理
    •     古い画像(一定時間認証されなかった画像)は自動的に削除

    simple_captchaは、こちらのサイトで公開されています。
    http://expressica.com/simple_captcha/

    今回はsimple_captchaの使い方と、画像認証を行う時に物足りない部分をカスタマイズした方法も書こうと思います。

    ます、インストールから
    サイトを見ると使い方の手順が書いてあるのでその通りに実行します。
     

    1.simple_captchaプラグインのインストール

    ruby script/plugin install svn://rubyforge.org/var/svn/expressica/plugins/simple_captcha    
     もしくは直接ダウンロード
    http://expressica.com/wp-content/plugins/wp-downloadMonitor/download.php?id=1

    2.simple_captchaのセットアップ
     rails2系以上     
       rake simple_captcha:setup     
     

     rails1系
      rake simple_captcha:setup_old  
     
     続けて1系2系ともに
      rake db:migrate  

    3.config/routes.rbの編集
        ActionController::Routing::Routes.draw do |map|  
         map.simple_captcha ‘/simple_captcha/:action’, :controller => ‘simple_captcha’  
        end    

    4.app/controllers/application.rbの編集
       ApplicationController < ActionController::Base
        include SimpleCaptcha::ControllerHelpers
       end

    つづいて、CAPTCHAを表示させたいアプリケーション側の編集です。
    simple_captchaは、画像認証のチェックをcontrollerで行う方法とmodelで行う方法がございます。

    まずcontroller側で認証させる場合

    1. viewの編集
     画像認証をさせたいページに
       <%= show_simple_captcha %>  
     を追加
    2. controllerの編集
     validateする個所に
    if simple_captcha_valid?
     画像認証OKの処理を書く
    else
     画像認証NGの処理を書く
    end 
    と書きます。



    つぎにmodel側で認証する方法です。
      決まったテーブルを登録または更新する時に画像認証を行う事がほとんどですのでmodelに認証を持たせたほうが私は実装が楽だと思います。

    たとえばuserモデル(会員登録など)で画像認証させる場合

    1.viewの編集
    <%= show_simple_captcha(:object=>”user”) %>
    オプションの一例
    :label => “画像の中の文字を入力してください”
    captchaの説明文の変更
    :image_style=>’simply_red’
    画像の種類を決められます。
    オプションを付けた例 
     <%= show_simple_captcha( :label => “画像の中の文字を入力してください。”,:image_style=>’simply_red’,:object=>”user”) %>

    2. modelの編集
      class User < ActiveRecord::Basse  
        apply_simple_captcha :message => ” 画像に表示された文字を再入力してください。”, :add_to_base => true
      end  

    オプションの
     messageとadd_to_baseはなくても使えます。
     これを付けると、デフォルトのエラーメッセージではなくmessageで指定した文字がエラーメッセージとして表示できます。

    3. controllerの編集
     @user.valid? と書く部分を
     @user.valid_with_captcha?
     に
    @user.save と書く部分を
    @user.save_with_captcha
    にします。

    with_captcha?を付けることで画像認証が行われます。

    これの便利な部分は他のところで
    @user.saveとしたら、画像認証を行わないので
    画像認証をするところと、しないところの切り分けが楽です。



    これでrailsを起動しページ表示すると画像認証(CAPTCHA)が表示されます。


    simple_captchのデフォルトじゃ物足りないのでカスタマイズしたこと

    基本の使えるオプションなどは
    vendor/plugins/simple_captcha/README
    を見てください。
    ベースの画像や画像の複雑さの設定方法が書かれています。

    以下は自分がカスタマイズさせた方法を書きます。

    問題1
    simple_captchaのデフォルトだと入力したアルファベットの大文字小文字を区別しない

    対応 vendor/plugins/simple_captcha/lib/simple_captcha_active_record.rb
    の49行目あたりの
    –          if captcha && captcha.upcase.delete(” “) == simple_captcha_value(captcha_key)

    +          if captcha && captcha.delete(” “) == simple_captcha_value(captcha_key)
    とし upcaseをとってしまう。

    問題2
    ランダムの文字数や英数字を混ぜたものを使いたい
    vendor/plugins/simple_captcha/lib/simple_captcha_action_view.rb

    def generate_simple_captcha_data(code)
    で文字を生成しているので好きに書き換えてしまう

    たとえばこうすると大文字小文字アルファベット+数字 のランダム6文字
     a = (‘a’..’z’).to_a + (‘A’..’Z’).to_a + (‘0’..’9′).to_a
     value= Array.new(6){a[rand(a.size)]}.join

    *日本語はさすがに文字化けでした・・・

    問題3
    6文字以上の文字が使いたい
    vendor/plugins/simple_captcha/assets/migrate/create_simple_captcha_data.rb
    のマイグレートファイルでlimit=>6に指定されているので
    無理に6文字以上にするとDB側ではじかれますので、
    ここの数字を変えるか、マイグレーションファイルを追加して好きな文字数にするとよいです。

    6文字以下はsimple_captcha_dataテーブルの変更はいりません。

    以上です。

    まとめ

    simple_captchaを使えば 画像認証(CAPTCHA)が簡単に素早く実装ができます。
     10分もあれば導入が可能ですのでお試しください。
    それと、プラグインのソースがきれいに書かれていますのでカスタマイズがしやすいと思います。

    注意
    *画像認証(CAPTCHA)は最近は破られる可能性があるという事ですので、スパムの対策に過信はしないほうがよいと思います
     次回は、画像認証以外の方法でスパムロボット対策方法を書けたらいいかなと思います。