天天看點

初談驗證碼與驗證碼設計

伴随着資訊的泛濫,伴随着程式的“智能化”,以至于我們都不能識别網絡的另一方是一個人還是一隻猴子。為了識别對方是不是一隻猴子,人們使用了一種 全自動區分計算機和人類的測試的技術,來防止這種現象,英文全稱Completely Automated Public Test to tell Computers and Humans Apart。

初談驗證碼與驗證碼設計

驗證碼一般應用在需要控制有效資訊輸入的情況下,最常見的就是使用者注冊、登入、投票等。Google的驗證碼也應用在使用者控制上,如Gmail中,當輸入的錯誤使用者名後,随便怎麼都不會有驗證碼出現,但是當使用者名正确的情況下,且輸入密碼錯誤超過兩次,則會出現驗證碼,這是一個比較完善和安全的驗證碼。

驗證碼的設計

這裡隻涉及到一個較簡單的驗證碼設計思路。

(1) 驗證碼的擷取。

驗證碼一般都通過一個類似接口位址動态擷取,例如http://www.impng.com/getCaptcha.php?auth=aXBmfFhEUFxFfDEyNTcxNzcwNTk。

(2) 驗證碼的有效性驗證。

驗證碼的有效性驗證可以通過session驗證,明文記錄在session中。驗證通過後一定要登出該session,這是很常見的安全隐患點。

還有以參數形式帶在URL中,不像session受會話限制,可以自由的在多台伺服器下做驗證,這也是在伺服器叢集下不能做到session同步的一種變相解決方法,但是這樣的方法,需要把驗證碼明文帶到頁面中,是以需要采取加密後的串,并且是可逆的加密。

(3) 驗證碼的顯示。

驗證碼一般帶有背景噪點或者幹擾線,但這不應該影響到對正常字元的識别。現在的應用很多都不使用背景噪點,幹擾線使用的較多。

驗證碼的體驗

在使用驗證碼的過程中,需要考慮到使用者的體驗度。

(1) 驗證碼字型處理。

驗證碼字元需要基于一個字型或者字型矩陣來生成。在字型的選擇上,需要明顯區分容易混淆的字元,如0和O,1和l、I等。

對于選取的字型中含有其他不使用到的字元,應該删除,以減小字型檔案大小,如在隻出現數字的驗證碼字元中,應該删除字型中的字母、符号。對于不用的中文字型來說,删掉它們會使上M的體積減小很多。

(2) 驗證碼的顯示。

需要明确的是,對于真正的使用者來說,驗證碼是一種沒有必要的措施,不需要驗證碼的時候千萬不要使用。就像Gmail的驗證碼,隻有密碼輸入錯誤次數達到兩次以上才會出現驗證碼,防止惡意暴力破解。

對于文字留言或者評論中使用驗證碼,可以參照Qzone的處理方式(雖然在某些方面來說,Qzone這裡做的不好),在頁面打開的時候不顯示驗證碼,隻有當使用者點選輸入框,即代表使用者想發表評論的時候,才會顯示驗證碼。采取這樣的方式也可以減少請求驗證碼圖檔的資源耗費,畢竟不是每個看文章的人都想評論,但需要考慮如何使驗證碼的顯示不唐突。

當顯示的驗證碼字元不容易識别時,應該引導使用者主動進行操作重新整理驗證碼,而不跳轉頁面。為了防止浏覽器緩存,需要在擷取驗證碼圖檔的URL後帶上一個随機數。

(3) 驗證碼的半智能化。

若可以确定隻是數字型的驗證碼,那麼就不應該讓使用者輸入數字外的字元。

若确定是5位的驗證碼,那麼當輸入不等于5位的時候,就不應該送出伺服器進行判斷。這是最簡單的用戶端判斷方法,避免不必要的伺服器連接配接驗證的消耗。

避免使用者輸入全角的字元,或者對于英文驗證字元而在中文輸入法狀态操作。這時候,“ime-mode: disabled;”可以派上用場。

當使用者輸夠驗證碼位數後,可以“自作聰明”的幫使用者将焦點移到下一個元素上。

(4) 驗證碼的可用性。

當驗證碼圖檔無法顯示時,或者使用者無法識别驗證碼時,需要有其他的替代方案。Google或者Space就提供了聲音識别方案。但是,将驗證碼明文顯示在圖檔的alt屬性中絕對不是一個好辦法。對于使用者注冊時遇到的無法識别驗證碼的問題,最簡單的解決辦法莫過于提醒使用者:打電話給客服通過。

驗證碼的突破

攻防兼顧,設計一個完善而安全的驗證碼,就需要知道怎麼破解驗證碼。對于那些機制不完善的驗證碼,如驗證碼明文直接寫在cookie中,不加密或簡單加密帶在擷取驗證碼圖檔的url參數中等,輕而易舉的就可以突破。

驗證碼中的字元無非是對現有字元的縮放、旋轉、變色、扭曲等,針對這些方法,一一破解之。一般可以采取下面的步驟破解:

  1. 字模制作。驗證碼無非是采用若幹種字型或者一些陣列字元的字型,采集一批驗證碼圖檔,分析下規律,做成字模。設計驗證碼的時候,若偷懶直接采用某些字型會很危險。
  2. 圖檔切割和去噪。将驗證碼圖檔切割為一個個的字元,切去空白部分,友善套字模。很多驗證碼都帶有背景噪點或者幹擾線,需要對圖像進行運算處理,盡可能去除。圖檔切割的程度影響到字模的比對。對于類似Google這種有粘連的字元,識别是很難的。
  3. 比對。

更有人提出一種變相的突破方法,把驗證碼嵌入到美女圖檔站,每輸入一個驗證碼才能看下一幅圖檔,為了某些目的,還是有很多人會不嫌麻煩的輸入。

對于某些多樣性的驗證碼,突破就很困難,但是一般這樣的驗證碼都會損失一定的使用者體驗,使用者自己都不好識别或者不好輸入。早期的騰訊QQ注冊和現有号碼安全部分采用的中文驗證碼,和現在網易采用的兩位中文驗證碼,涉及到中文就複雜些,更有做成SWF格式或GIF格式的,字元是浮動的,需要取幀來做判斷。

原文位址:http://www.impng.com/web-dev/design-of-captcha.html

繼續閱讀