數十萬互聯網從業者的共同關注!
作者:閔傑
來源:攜程技術中心(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]
本文由作者授權早讀課發表,轉載請聯繫作者。