圖形驗證碼在攜程的實踐之路

攜程 英語 產品經理 iOS 互聯網er的早讀課 2017-06-11

數十萬互聯網從業者的共同關注!

作者:閔傑

來源:攜程技術中心(ID:ctriptech)

編輯:Juvae

從互聯網行業出現自動化工具開始,驗證碼就作為對抗這些自動化嘗試的主要手段登場了,在羊毛黨,掃號情況層出不窮的今天,驗證碼服務的水平也直接決定一家互聯網企業的安全係數。作為WEB看門人,它不僅僅要做到安全,也要兼顧體驗

本文將分享攜程信息業務安全團隊在這幾年裡,對圖形驗證碼服務所做的一些大大小小的改變。各位可以將本文作為自身網站圖形驗證碼搭建的小攻略,減少重複踩坑的情況。

1.0時代

過去攜程曾經使用了一套基於.NET的圖形驗證碼作為控制登錄,註冊,發送手機短信,點評,重置密碼以及其他相關場景的主要手段,目的也很簡單,就是防止非實人的請求。

在這個階段,設計時僅僅是滿足了防禦異常請求,並沒有考慮太多用戶體驗以及產品上線後,運營數據收集再分析改造的需求。

主要實現的功能點為:

  • 圖片驗證一次失效

  • 圖片生成超時失效

  • 支持生成4位和6位驗證碼,字符以英文和數字組成

  • 支持簡單的字符粘連,干擾線,干擾點,字體,字符大小,字體扭曲等配置。

驗證碼圖示:

圖形驗證碼在攜程的實踐之路

流程圖如圖所示:

圖形驗證碼在攜程的實踐之路

事後來看,這套驗證碼系統由於架構簡單,接入簡便,在很長一段時間內,擔當了攜程門戶主要的看門人的角色,儘管各大BU並不是非常情願地使用了這套服務,但是在防範撞庫,惡意請求短信,批量獲取優惠卷等場景下,還是體現出了一個驗證碼服務所應該起到的作用。

當時這套驗證碼服務上線後,遇到了不少的問題:

1、服務並沒有對接入方做場景,事務等區別,整個攜程的驗證碼難度都是統一的(除了部分BU自己開發了驗證碼),經常發生在A頁面出現被掃號情況,需要增強驗證碼難度,但是B頁面隨之反饋,驗證碼太難,收到用戶投訴,需要降低難度,無法兼顧。

2、服務記錄的字段僅僅能支撐服務正常運行,業務數據沒有進行記錄。導致了驗證碼有時候調用和驗證異常升高,完全無法知曉是誰在進行惡意嘗試並進行攔截(比如封停惡意IP)。

3、只有英文數字,並且字體單一,設置的扭曲干擾線簡單點,極易被OCR識別,假如設置的太難,就會造成連正常用戶都無法識別的窘境,在很長的一段時間內,只能將難度設置在簡單-中等這種難度,談不上對於批量OCR有任何的防禦。

而說到這類驗證碼的破解,業內目前通用的方案,我瞭解下來有這麼幾種:

1、通過各種手段,繞過風控,或者繞過驗證碼,比如某些驗證碼是本地校驗,有些驗證碼的關鍵參數會下發至前端,用戶可以修改參數達到控制驗證碼的目的,有些業務方接入了驗證碼,但是沒有把校驗和業務接口綁在一起,導致人家可以直接請求業務接口,驗證碼形同虛設。也有業務方在接入驗證碼的時候,登錄動作先於驗證碼校驗,也導致了驗證碼毫無意義。這些在過往的接入過程中,都是實際發生過的情況。

2、ORC,從二值化,去除干擾線/點,確定字體區域,到最後識別,會根據驗證碼本身難度的不同,顯著的影響其識別率。

3、人工打碼平臺。目前打碼平臺針對圖片驗證碼已經很成熟了,針對數字,英文,漢字,智能問答都有不同的價格。

4、CNN神經網絡識別。通過大量的樣本進行機器學習,對於某些OCR比較難識別的粘連字符字體,可能會有一個較好的識別結果。

隨著各類攻擊越來越多,穿透性也日益增強,業務部門對於驗證碼難度需求不一致,以及自身對於驗證碼數據收集再改造的這些情況下,改造這個服務已經成為了擺在眼前的事情。

1.5時代

在總結了上述提到的這些問題以後,新需求就自然而然的產生了:

  • 英文和字母模型太過單一,極易破解,需要加入中文字庫。

  • 業務數據保留,至少得知道威脅是哪些地方過來的。

  • 能夠在面對大量的OCR或者暴力嘗試場景下,自動變化難度,降低對方的識別率。

  • 區分接入的業務方,難度可以根據業務方做不同的調整。

在產品開發測試的一輪輪投入後,新的需求完成了,並且又花了將近一年的時間推廣了各個BU接入了這個新的驗證碼。

(在這裡說一個實際的情況,就是在第一版驗證碼開發的時候,並不重視保留接入方的信息,導致了在進行第二輪驗證碼重新接入的時候,發現老的接入方有3位數,但是要找誰,完全不清楚,以至於有些驗證碼到目前都沒有進行更新,這個服務接入註冊其實是一個很小的功能,但是在版本更迭,重大事務通知上,能起到非常重要的作用)。

新版本驗證碼比較好的解決了下面這幾個實際場景面對的問題:

1、再也不會出現某個應用發現異常請求,剛剛調高難度沒多久,就接到投訴電話,需要把難度降低這種場景,可以根據各自應用手動或者自動調節難度。(原先是整個公司都是統一的難度耦合在了一起)。

2、可以知道威脅是來自於哪個IP或者設備的,針對性的做出響應,比如封停請求。

3、在面對掃號配合OCR工具的情況下,這套驗證碼會自動不停的變換難度,干擾點/線,字體,背景色,粘連度等,經過實際對比觀察,防禦效果比老版本提高了2倍,這裡我們的策略分為全局難度提高和針對緯度進行提高,比如假設只有一個IP或者設備的驗證碼請求發現異常,我們只會提高來自於這個IP或設備請求的驗證碼難度,對於其他正常請求是無感知的,但是在某些情況下,比如大規模的分佈式掃號,可能你需要使用的就是全局難度提高。

4、支持了中文驗證碼,實際測試,英文數字在成熟的OCR工具面前,哪怕做了混淆,解析成功率也接近50%,假設換成中文配合一定的混淆,解析成功率一般不高於20%,這也是很多團隊初期,假設沒有風控和其他的輔助服務,最直接,成本最低的提高防禦力度的方案。

這套方案,作為主流的驗證碼方案在攜程應用了很久,但是在去年,團隊也終於意識到,還有很多問題是這套驗證碼方案所無法解決的:

1、用戶的體驗問題,這個問題被公司內部詬病很久,並偶爾會收到來自於外部用戶的投訴。其實也很好理解,一個四個字的隨機中文驗證碼,手機輸入一次大約耗時15-20秒,這個在活動營銷拉新場景下,是一個致命的轉化率殺手。在很多力度不是非常大的活動面前,這個驗證碼會直接打消一部分正常用戶去嘗試的念頭(儘管中文驗證碼在防禦惡意請求接口上有著巨大的安全優勢),作為業務方產品不得不考慮,假設惡意用戶的比例是5%,犧牲剩下95%用戶的體驗是否值得,即便也只有5%的正常用戶放棄了嘗試(比如一些年紀大的客戶),和惡意用戶的比例相仿,但是剩下的用戶還是需要輸入這些驗證碼,在用戶體驗成本上的讓步是巨大的,這樣就會讓安全和業務陷入一種零和博弈的局面,這往往也是安全部門不受歡迎的主要原因。

2、接入繁瑣,驗證碼和風控作為2個服務,需要業務方去耦合,分別接入,聽起來就很繁瑣,實際接入也確實很繁瑣,大量的時間花費在接入服務上。

3、無法應對國際化,中文驗證碼國外用戶不認識,英文數字過於簡單壓根沒辦法防禦主流掃號攻擊。實際發生過的案例就是攜程海外站點被大規模掃號,但是束手無策的局面,分佈式IP和設備,無法採用中文,幾萬個IP手動封不談累不累,CFX都裝不下,只能看著他掃。

4、醜,驗證碼圖片由於需要防破解的關係,往往和整體頁面UI的風格完全沒有一個搭配感,讓人很齣戲。

和各大競品比起來,我們的驗證碼確實就像是石器時代在和工業時代比較,也被公司內部一次次吐槽實在太影響體驗了。在這種內憂外患的局面下,驗證碼服務更新又一次被放到了檯面上。

2.0時代

需求又一次的被明確:

  • 接入要簡便,不要讓業務方再需要自己對風控結果和驗證碼來處理相關邏輯。

  • 體驗要好,移動端時代,尤其要考慮移動端輸入的習慣。

  • 安全性和國際化問題,至少不能讓有些用戶投訴自己無法輸入中文字。

  • 美觀,和頁面UI儘量融合,也需要可以讓業務方自行美化。

又是一輪一輪的測試開發,大約在半年前,完成了本次驗證碼重構的第一版,他主要實現瞭如下功能:

1、體驗問題被解決了,在對比多種競品以後,我們採取的方案為“滑塊+選字”,在安全認為請求有風險的情況下,會出現滑塊,假設在你滑動滑塊期間採集的數據不足以認為請求是可信的情況下,會出現選字或者直接禁止請求訪問,根據實際數據,用戶滑動滑塊的時間耗時一般平均在0.5秒一次,僅有很少的一部分用戶會出現選字,選字一般的耗時在7秒左右,平均下來,整體耗時目前在攜程實踐下來,在1.7秒左右。

2、接入問題也得到了改進,業務方目前接入僅僅需要在頁面上引入一個JS(APP為一個SDK),然後在監聽到JS的一個事件提示,可以獲取token後,獲取token,由業務方服務端獲取token以後到安全這裡的校驗服務校驗,校驗完成以後,整個流程就結束了,中間的判斷風險,出現滑塊,滑塊校驗,出現選字,選字校驗這些步驟業務方都無需干涉以及傳送數據,安全已經把後端的風控,風險倉庫和驗證碼前端全部打通,業務方在無感知的情況下,相當於接入及使用了3個服務。

3、國際化問題,目前已經支持東南亞多國語言的選字和提示語服務,常用國家再也不會有無法看懂和無法輸入的詬病。

新版驗證碼服務如圖所示:

圖形驗證碼在攜程的實踐之路圖形驗證碼在攜程的實踐之路

流程圖如圖:

圖形驗證碼在攜程的實踐之路

這個版本作為目前攜程驗證碼的主流應用版本,將在各個場景下代替過去的填字驗證碼,在體驗和安全性上,大幅度超越之前的服務。

按照目前攜程的每日驗證情況來計算,新驗證碼對比老驗證碼能每天給用戶節約500小時的驗證時間。

填字驗證碼在H5端,通過大量實踐,在保證安全性的前提下,輸入正確率一般在88%-90%,存在了一個天花板,在新驗證碼上線後,整體通過率已經提高到了96%,接近了我們認為的實際異常比例。

同時我們對於前端採集的大量數據做了模型訓練,對於某些規則難以發現的問題,會採用模型的結果來進行處理。

在某些公共登錄註冊場景下,我們會採用BI畫像+特定活動物料的模式,給特定的用戶進行驗證碼渠道的推廣服務,如圖:

圖形驗證碼在攜程的實踐之路

但是這套服務,也存在一定的問題:

1、滑塊服務存在被破解的可能,據一些外部專業測試機構報告,目前外部主流的一些SAAS滑塊服務,被破解的概率在60%(他能讓滑塊認為他是安全的請求,選字就不會出現了)

2、選字的OCR識別依然存在,雖然存在要識別兩套並點選的難度,但是有些外部專業團隊已經實現了一定程度的破解。

3、體驗上,在IOS系統,滑塊容易造成頁面的回退,對於一些指甲長的用戶尤其容易造成這個問題,目前的解決方案只能是加大滑動條的大小,儘量遠離屏幕邊緣。

結語

沒有一種驗證碼可以通吃所有場景,也沒有絕對安全無法破解的驗證碼,只有在業務和安全不停權衡的前提下,找到一個屬於體驗和安全平衡的點,這才是驗證碼正確的打開方式。在和各種黑產團隊不停鬥爭的過程中,驗證碼服務只有不停的改變,創新,才可以適應當前複雜的黑產現狀以及業務多變的場景。

作者簡介:閔傑, 攜程信息安全部產品經理。2015年加入攜程,主要負責黑產防刷,驗證碼,反爬以及UGC方面的產品設計,關注在低成本的前提下,解決以上場景的實際問題。

投稿郵箱:[email protected]

本文由作者授權早讀課發表,轉載請聯繫作者。

相關推薦

推薦中...