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