1. 程式人生 > >初談驗證碼與驗證碼設計

初談驗證碼與驗證碼設計

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

captcha
驗證碼一般應用在需要控制有效資訊輸入的情況下,最常見的就是使用者註冊、登入、投票等。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