iT邦幫忙

DAY 25
13

Rails 的簡單任務系列 第 27

[RoR] 簡單建置 captcha 圖形驗證的機制

什麼是 Captcha?也有 中文 的相關說明。常會看到類似這樣的圖形:

接續前幾篇利用 ImageMagick 相關的圖形議題,可快速加上 captcha 的機制。
簡而言之,就是做成人可以辨識,但無法利用程式軟體去辨識的圖形,要人親自回應圖形內容是什麼,才提供請求服務之機制。通常會在可以留言、註冊帳號、下載檔案等功能中,加入這 Captcha 的機制,以防止被透過程式,造成大量的 spam 留言,註冊、下載;為了防止辨識軟體破解,而會將圖形做一定程度的扭曲,目的是使真人看得懂,但程式無法辨識出,這是圖形特色。

安裝 captcha 的 plugins
RoR 中加入 Captcha 的機制有幾種的解決方式,在此用最簡單的方案 Simple Captcha ,只要照著該文的步驟,很快就可以建置此機制。

# 如果系統沒有 subersion 的話,會無法執行再下一個指令(有關 svn: 的網址下載),才需要先做安裝 subversion 的動作。
yum install subversion
# 安裝 plugins
script/plugin install svn://rubyforge.org/var/svn/expressica/plugins/simple_captcha
rake simple_captcha:setup
rake db:migrate
# 在 config/routes.rb 編輯:
ActionController::Routing::Routes.draw do |map|
...
# 多加這一行:
  map.simple_captcha '/simple_captcha/:action', :controller => 'simple_captcha'
...
end
# 在 app/controllers/application.rb 編輯:
ApplicationController < ActionController::Base
...
# 多加這一行:
  include SimpleCaptcha::ControllerHelpers
end

captcha 使用的環境設定完成。

使用 captcha 的機制
以前一日 [RoR] 簡單畫出 Web 2.0 特色圖形 Badges 徽章 標記 的例子為例,要加上 captcha 只要在 app/views/demo/index.html.erb 裡:

<%= show_simple_captcha(:label => "請輸入您所看見的字母", :image_style => "random", :distortion => 'medium') -%>
# 在 <%= submit_tag "畫出預覽", :name => nil %>  這一行的上面加入上面這一行

上述的 show_simple_captcha 的其他參數語法,可詳見該網站 Simple Captcha 來測試出會有怎樣不同的畫面。

而在 相對應的 controller 之中,只要將需要做這個圖型驗證的 action ,加入

  if simple_captcha_valid?
    do_this # 原有的 action 動作
  else
    do_that # 不進行上述 action 的回應
  end

這樣的語法,就可先檢查圖型驗證是否正確,而決定是否執行該動作:
所以在 前一篇 的原始碼中 app/controllers/demo_controller.rb 加入上述的語法:

def star
if simple_captcha_valid?
# 若沒有 text 的參數,用此預設值寫出字來
...
else
    render :text => "識別碼不對,請回上一頁,重新整理後再輸入新的正確的識別碼"
end

end

這樣在接續 前一篇 的程式碼,再加上述的語法,就會出現像

就可利用 captcha 而達到防止被濫用的目的。


上一篇
[RoR] 簡單畫出 Web 2.0 特色圖形 Badges 徽章 標記 (續)
下一篇
[RoR] 簡單加入 Tag, Tagging 標籤功能
系列文
Rails 的簡單任務33

1 則留言

0

感恩分享咯!

我要留言

立即登入留言