ホーム 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)は最近は破られる可能性があるという事ですので、スパムの対策に過信はしないほうがよいと思います
 次回は、画像認証以外の方法でスパムロボット対策方法を書けたらいいかなと思います。

記事を共有

最近人気な記事