RSS RSS
nakahira@rails ブログ(Ruby on Railsのシステム開発)
2009.06.15
カテゴリ:初心者向け - 役立ちツール

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

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

 

ブックマークに追加する

.
web開発ならKBMJ
Rubyでのwebシステム開発は
実績豊富なKBMJにお任せ下さい
iPhone開発
iPhone開発は
KBMJにお任せ下さい
ブラウザゲーム エインヘリアル
ブラウザゲーム「エインへリアル」
αテスター募集中
オープンソースECパッケージ エレコマ
オープンソースECパッケージ
「エレコマ」

プロフィール

nakahira
nakahira
kbmjでrailsエンジニアをしている。中平です。

ruby on railsのこと:
ruby on rails でのシステム開発は2006年12月ぐらいからおこなっております。
ruby on rails を知ってからは他の言語をやりたくないぐらい、ハマってます。

開発環境:
あえてWindows vistaで開発をしています。(人柱w)
aptanaというIDEを使っています。自分の周りではvimを使う人が多いですが・・・・
vimが軽くて使いやすいのは知ってますけど、自分が好きな物を使えばいいとおもうのと、vimのことはいろんな人に聞けるけど、aptanaの使い方わからないという人の為にあえて人柱w

私のこと:
攻殻機動隊が大好きです。タチコマ大好き!!
人工無能に興味あり、社内ircとsnsに人工無能ボットを仕込んで遊んでいます。
無能のコアは、rubyで作られたシシャモを利用しているので、いつかは自分の人工無能エンジンを創ってみたいですね。

最近チェックした記事

最新記事

アーカイブ

アクセスランキング

KBMJのWebソリューション
Ruby on railsの開発ならKBMJ
株式会社ケイビーエムジェイ