圖片驗證碼是驗證碼的一種,圖片驗證碼常見的形式有輸入圖片中字母、數字等,目前的發展更爲多元。下面小編從多方面跟你們講講圖片驗證碼。javascript
➤驗證碼的前世此生
全自動區分計算機和人類的圖靈測試(Completely Automated Public Turing test to tell Computers and HumansApart,簡稱CAPTCHA),俗稱驗證碼,是一種區分用戶是計算機或人的全自動化程序。php
- 標準驗證碼
標準驗證碼便是咱們常見的圖形驗證碼、語音驗證碼,基於機器難以處理複雜的計算機視覺及語音識別問題,而人類卻能夠輕鬆的識別來區分人類及機器。前端
- 創新驗證碼
創新驗證碼是基於第一代驗證碼的核心思想(經過人類知識能夠解答,而計算機難以解答的問題進行人機判斷)而產生的創新的交互優化型驗證碼。第二代驗證碼基於第一代驗證碼的核心原理:「人機之間知識的差別」,拓展出大量創新型驗證碼。java
- 無知識型驗證碼
無知識型驗證碼最大的特色是再也不基於知識進行人機判斷,而是基於人類固有的生物特徵以及操做的環境信息綜合決策,來判斷是人類仍是機器。如Google的ReCaptcha。web
➤圖形驗證碼在發展中的技術對抗
(1)避免觸發驗證碼驗證碼的引入會帶來用戶友好度的降低,增長驗證碼輸入以及人眼對驗證碼識別的可能錯誤等都會帶來很差的使用體驗。這對追求用戶體驗的網站來講,在沒遇到可疑行爲時,其採起的策略是默認不開啓驗證碼功能,當觸發可疑行爲識別規則時,纔會出現驗證碼。基於此原理,對攻擊方來講,就是儘可能避免觸發可能出現驗證碼的規則。通常可疑行爲識別是經過檢查頻繁嘗試而且出錯這個行爲來進行,基於此的對抗措施則是使用不一樣的IP來進行嘗試,或者等待足夠的時間再次嘗試,這樣讓目標網站程序認爲這些嘗試都是正常的訪問請求,從而在自動化程序端連續做業時不會出現驗證碼而達到繞過的目的。算法
(2)驗證碼固定從前面的驗證碼固定問題描述可看出,攻擊者能夠在同一個會話下,在得到第一個驗證碼後,後面再也不主動觸發驗證碼生成頁面,而且一直使用第一個驗證碼就可循環進行後面的表單操做,從而繞過了驗證碼的屏障做用。json
(3)驗證碼機器自動識別計算機自動識別驗證碼,主要原理是經過必定的算法預先創建驗證碼範圍內的字體特徵庫,再將要識別的驗證碼經過一樣的算法生成特徵,與以前保存的特徵庫進行比較,進而獲得圖片驗證碼的值。通常地,其識別過程有以下圖所示的處理流程:後端
(4)深度學習——GANs網絡網站登陸圖像驗證碼的發展到如今,遇到的最大的威脅可能就是深度學習了,特別是GANs網絡的出現,讓圖像驗證碼遇到了最強勁的對手。服務器
➤ 圖片驗證碼剖析
- 道高一尺魔高一丈
圖片驗證碼在不斷髮展,目的就是爲了不一些非正經常使用戶操做。而不論圖形驗證碼如何發展,終究是敵不過攻擊者的破解手段,正所謂 「道高一尺魔高一丈」 。就好比鐵路12306的圖片點選驗證碼,不只沒有擋住黃牛,反而讓黃牛搶票更加輕鬆。網絡
- 爲何受傷的老是我
在開發者與攻擊者的角逐中,受影響最大的莫過於咱們用戶了。各類千奇百怪的複雜驗證碼,不是爲了考驗黑客,而是考驗用戶。
驗證碼的圖片經常扭曲得連人眼都認不出來。這在那些無實義的字詞中體現得格外明顯,就像「rl10Ozirl」。裏面用的究竟是小寫的字母「L」仍是數字「1」?是數字「0」仍是字母「O」?真正的用戶在使用途中真的是飽經磨難。。。「爲何受傷的老是我」。
- 浪費你們的寶貴時間
據卡內基梅隆大學的研發小組估算,全球人口天天在這些煩人的屏障入口處所耗費的時間,累計可達15 w小時。有種新型的驗證碼——「多重驗證碼」(reCaptcha),至少是把這些時間用在了公共價值的創造上。你看到的圖片是一個從掃描不良的谷歌(微博)圖書中截取出來的模糊單詞;而你輸入該詞拼寫的過程,其實就是在協助谷歌處理、識別一段有效文本。
即使如此,咱們這些守規矩的用戶,天天仍是會浪費掉17年的時間。這簡直是對生命的可恥浪費。而用戶真正想要的是去掉這些額外的操做。
➤ 去掉圖片驗證碼咱們用什麼
- 風控防火牆
風控防火牆是近幾年研發出來的一種專門應用於原圖片驗證場景的替代品。它將徹底取締原來的圖片驗證碼,將用戶體驗作到最好。在用戶徹底無感的狀況下來區分正經常使用戶與非正經常使用戶。經過AI立體防護機制,實時防控。用戶不再用擔憂出現(「驗證碼輸入錯誤!
」)的煩人提示了。
➤ 如何使用風控防火牆
第一步:獲取防火牆賬號密鑰
進入 防火牆控制檯,在左側導航欄選擇【網站管理】,進入網站管理頁面,單擊【發到郵箱】接收密鑰。
第二步:下載防火牆服務器
前往新昕科技官網,在頂部導航欄選擇【解決方案】>【下載中心】,進入下載中心頁面,找到短信防火牆服務器安裝包,點擊【下載連接】便可下載。
第三步:業務系統先後端接入
web 前端接入:
Java 在頁面合適的位置(標籤內)加入如下代碼引入JS文件:
<script type="text/javascript" src="/NxtJsServlet"></script>
PHP 在頁面合適的位置(標籤內)加入如下代碼引入JS文件:
<script id="finger" type="text/javascript" src="/nxt_inc/nxt_front.php"></script>
後端接入:
Java
修改配置(和業務系統同系統不須要修改):
newxtc.ini (存放位置:"/WEB-INF/classes/newxtc.ini") 修改參數(fireWareUrl)--> fireWareUrl=http://localhost:7502
- 短信下發
public RetMsg smsSend(HttpServletRequest request, HttpServletResponse response, String clientMobile) { RetMsg retMsg = new RetMsg(-1, "系統異常"); FwClient fwClient = new FwClientImpl(); try { // 1 調用【短信防火牆】短信發送請求 HashMap < String, Object > paramMap = fwClient.getSendReq(request, clientMobile); String jsonReq = fwClient.execReq(paramMap); String smsSendRet = fwClient.getRetVaule(jsonReq, "riskResult"); if("REJECT".equals(smsSendRet)) { retMsg.setRet(3); retMsg.setMsg("請求過於頻繁"); } else { // 業務 TODO // 業務調用短信接口 TODO // 調用短信接口 結束 if(smsRetMsg != null && smsRetMsg.getRet() == 0) { // 2 調用【短信防火牆】成功結果 fwClient.execSucc(paramMap); logger.debug("send succ"); retMsg.setRet(0); retMsg.setMsg("發送驗證碼成功"); } else { // 2 調用【短信防火牆】失敗結果 SmsVerifyCache.getInstance().remove(clientMobile); fwClient.execFail(paramMap); retMsg.setRet(-1); retMsg.setMsg("發送驗證碼失敗"); } } } catch(Exception e) { for(StackTraceElement elment: e.getStackTrace()) { logger.error(elment.toString()); } } return retMsg; }
- 短信驗證
public RetMsg smsVerify(HttpServletRequest request, HttpServletResponse response, String clientMobile, String smsVerifyCode) { FwClient fwClient = new FwClientImpl(); RetMsg retMsg = new RetMsg(-1, "系統異常"); if(smsVerifyCode == null || smsVerifyCode.isEmpty()) { retMsg.setRet(1); retMsg.setMsg("輸入驗證碼爲空"); } else { // 1 調用【短信防火牆】驗證請求 HashMap < String, Object > paramMap = fwClient.getVerifyReq(request, clientMobile); // 請求防火牆 String jsonReq = fwClient.execReq(paramMap); // 報文處理 String smsSendRet = fwClient.getRetVaule(jsonReq, "riskResult"); if("REJECT".equals(smsSendRet)) { retMsg.setRet(3); retMsg.setMsg("請求過於頻繁"); } // 業務 TODO if(cacheSmsVerify != null && cacheSmsVerify.getVerifyCode() != null && !cacheSmsVerify.getVerifyCode().isEmpty()) { if(cacheSmsVerify.getVerifyCode().equals(smsVerifyCode)) { retMsg.setRet(0); retMsg.setMsg("驗證成功"); } else { retMsg.setRet(1); retMsg.setMsg("驗證碼錯誤"); } } else { retMsg.setRet(-9); retMsg.setMsg("驗證碼超時"); } if(retMsg.getRet() == 0) { // 2 調用【短信防火牆】成功結果 fwClient.execSucc(paramMap); } else { // 2 調用【短信防火牆】失敗結果 fwClient.execFail(paramMap); } } return retMsg; }
修改配置文件(和業務系統同系統不須要修改):
nxt_ini.php (存放位置:"\nxt_inc") 修改參數($GLOBALS ["fireWareUrl"])-->$GLOBALS["fireWareUrl"]="http://localhost:7502"
- 短信下發
require_once $_SERVER['DOCUMENT_ROOT']. "/nxt_inc/nxt_client.php"; /** * 發送短信 * @param $mobile */ public function send(string $mobile) { $fwClient = new ClientApi(); // 獲取下發短信報文 $paramMap = $fwClient - > getSendReq($phone); // 執行下發短信請求 $jsonReq = $fwClient - > execReq($paramMap); $fwRet = $fwClient - > getRetVaule($jsonReq, "riskResult"); if("REJECT" != $fwRet) { // 發送短信業務 TODO if(發送成功標記) { // 下發短信成功 $fwClient - > execSucc($paramMap); } else { // 下發短信失敗 $fwClient - > execFail($paramMap); } } }
- 短信驗證
/** * 短信驗證 * @param $mobile */ public function smsVerify(string $mobile) { $fwClient = new ClientApi(); // 獲取短信驗證報文 $paramMap = $fwClient - > getVerifyReq($phone); // 執行短信驗證請求 $jsonReq = $fwClient - > execReq($paramMap); $fwRet = $fwClient - > getRetVaule($jsonReq, "riskResult"); if("REJECT" != $fwRet) { // 驗證短信業務 TODO if(驗證成功標記) { // 驗證短信成功 $fwClient - > execSucc($paramMap); } else { // 驗證短信失敗 $fwClient - > execFail($paramMap); } } }
第四步:查看風控數據
防護攔截數據一覽無餘,實時查看當日數據詳情與近期風險趨勢。 經過風控數據看板,可查看1-30天的驗證狀況、風控攔截狀況以及驗證事件觸發的AI模型狀況。
進入防火牆控制檯,在左側導航欄選擇【風險大盤】,進入風險大盤頁面。
➤結語
這篇文章到這裏就結束了,感謝大佬們駐足觀看,大佬們點個關注、點個讚唄~
謝謝大佬~
做者:香芋味的貓丶