什麼是CAPTCHA呢?
CAPTCHA是”Completely Automated Public Turing test to tell Computers and Humans Apart”的縮寫,那是一種用來區別使用者是人還是電腦的方式,一般都是產生圖形,讓使用者輸入圖形所代表的文字並加以驗證,主要用途是防止電腦程式灌票,或防止電腦程式登錄大量帳號或灌入大量廣告留言等。
那麼,如何在Rails底下做到CAPTCHA的機制呢?其實解決方式還滿多的,但我個人選擇外掛,通常有幾項要求:
- 不會有系統安全方面的問題
- 程式碼必須漂亮簡單
- 對人類有益
我看過有人推薦Simple Captcha,但我覺得這是最爛的選擇,而且在Ruby On Rails Security Guide一文中也不推薦使用。
理由是產生出來的圖形辨識碼過於簡單,不合乎CAPTCHA必須防止以OCR方式解讀的實做規範,既然有安全上的漏洞,就不是一個好的解決方式。
什麼是ReCAPTCHA呢?
ReCAPTCHA是卡內基美隆大學的一項計畫, 本質上除了是一種圖形驗證碼服務之外,更是集全球網友之力協助將書籍典藏數位化的浩大工程,這在他們家有非常詳盡的說明,這裡不再贅述。
難道ReCAPTCHA就一定比較安全嗎?當然比較安全,因為ReCAPTCHA提示的圖片就是OCR掃描實際書本內容,但解讀錯誤的圖片,最後再加上一層防解讀條碼。當使用者在做圖形驗證時,正好可以協助人工解讀,而將書籍數位化!!
在Rails上,強力推薦使用ReCAPTCHA外掛,因為他完全符合我對外掛的要求:安全、簡單以及對人類有益。
ReCAPTCHA這個外掛將recaptcha.net所提供的服務包裝起來,成為短短幾行的程式呼叫。我們先把外掛安裝起來:
rapt install -x http://svn.ambethia.com/pub/rails/plugins/recaptcha
由於這個外掛必須搭配recaptcha.net使用,因此必須到recaptcha.net申請帳號,並輸入自己要使用這項圖形辨識服務的網域。
如果您是在本機測試使用的話,直接輸入localhost就行。
輸入好之後,記下他給你的公開金鑰與私密金鑰。接著,在Rails的config/environment.rb填入這兩個金鑰:
# ReCAPTCHA key variables.
ENV['RECAPTCHA_PUBLIC_KEY'] = "your_recaptcha_public_key_goes_here"
ENV['RECAPTCHA_PRIVATE_KEY']= "your_recaptcha_private_key_goes_here"
接著,在您需要提供圖形辨識的那一個view裡頭多加一行:
<%= recaptcha_tags %>通常這會是一個含有form_tag的view,例如投票區或留言板
之類的。
請記住一定要將這一段扣放在form_tag之中,這樣才會隨著表單送出而將辨識碼送到recaptcha.net驗證。
再來就是controller,這也許是一個投票動作存檔或留言存檔之處,我們只要把原先判斷存檔成功的程式碼多加入圖形驗證是否成功的判斷即可,例如:
if verify_recaptcha(@post) && @post.save
# vote or comment process here
else
# fail process
end
以上。
回顧一下,使用ReCAPTCHA的整個步驟是
- 去recaptcha.net申請帳號,註冊網域,取得金鑰
- 將公開金鑰與私密金鑰填入environment.rb
- 在view加入recaptcha_tags
- 在controller加入verify_recaptcha
整個過程簡單、安全,又可以協助將書籍典藏數位化,如此一來就覺得這個外掛真的是非用不可。

