> 圖片驗證碼是驗證碼的一種,圖片驗證碼常見的形式有輸入圖片中字母、數字等,目前的發展更爲多元。下面小編從多方面跟大家講講圖片驗證碼。
## ➤驗證碼的前世今生
全自動區分計算機和人類的圖靈測試(Completely Automated Public Turing test to tell Computers and HumansApart,簡稱CAPTCHA),俗稱驗證碼,是一種區分用戶是計算機或人的全自動化程序。
- **標準驗證碼**
標準驗證碼即是我們常見的圖形驗證碼、語音驗證碼,基於機器難以處理複雜的計算機視覺及語音識別問題,而人類卻可以輕鬆的識別來區分人類及機器。
![在這裏插入圖片描述](https://img-blog.csdnimg.cn/20210202125457404.jpg?#pic_center)
- **創新驗證碼**
創新驗證碼是基於第一代驗證碼的核心思想(通過人類知識可以解答,而計算機難以解答的問題進行人機判斷)而產生的創新的交互優化型驗證碼。第二代驗證碼基於第一代驗證碼的核心原理:“人機之間知識的差異”,拓展出大量創新型驗證碼。
![在這裏插入圖片描述](https://img-blog.csdnimg.cn/20210202114346939.png?#pic_center)
- **無知識型驗證碼**
無知識型驗證碼最大的特點是不再基於知識進行人機判斷,而是基於人類固有的生物特徵以及操作的環境信息綜合決策,來判斷是人類還是機器。如Google的ReCaptcha。
![在這裏插入圖片描述](https://img-blog.csdnimg.cn/20210202114155428.png?#pic_center)
## ➤圖形驗證碼在發展中的技術對抗
(1)避免觸發驗證碼驗證碼的引入會帶來用戶友好度的下降,增加驗證碼輸入以及人眼對驗證碼識別的可能錯誤等都會帶來不好的使用體驗。這對追求用戶體驗的網站來說,在沒遇到可疑行爲時,其採取的策略是默認不開啓驗證碼功能,當觸發可疑行爲識別規則時,纔會出現驗證碼。基於此原理,對***方來說,就是儘量避免觸發可能出現驗證碼的規則。一般可疑行爲識別是通過檢查頻繁嘗試並且出錯這個行爲來進行,基於此的對抗措施則是使用不同的IP來進行嘗試,或者等待足夠的時間再次嘗試,這樣讓目標網站程序認爲這些嘗試都是正常的訪問請求,從而在自動化程序端連續作業時不會出現驗證碼而達到繞過的目的。
(2)驗證碼固定從前面的驗證碼固定問題描述可看出,***者可以在同一個會話下,在獲得第一個驗證碼後,後面不再主動觸發驗證碼生成頁面,並且一直使用第一個驗證碼就可循環進行後面的表單操作,從而繞過了驗證碼的屏障作用。
(3)驗證碼機器自動識別計算機自動識別驗證碼,主要原理是通過一定的算法預先建立驗證碼範圍內的字體特徵庫,再將要識別的驗證碼通過同樣的算法生成特徵,與之前保存的特徵庫進行比較,進而得到圖片驗證碼的值。一般地,其識別過程有如下圖所示的處理流程:
![在這裏插入圖片描述](https://img-blog.csdnimg.cn/20210202113101234.jpg?#pic_center)
(4)深度學習——GANs網絡網站登錄圖像驗證碼的發展到現在,遇到的最大的威脅可能就是深度學習了,特別是GANs網絡的出現,讓圖像驗證碼遇到了最強勁的對手。
## ➤ 圖片驗證碼剖析
- **道高一尺魔高一丈**
圖片驗證碼在不斷髮展,目的就是爲了避免一些非正常用戶操作。而不論圖形驗證碼如何發展,終究是敵不過***者的破解手段,正所謂 “道高一尺魔高一丈” 。就比如鐵路12306的圖片點選驗證碼,不僅沒有擋住黃牛,反而讓黃牛搶票更加輕鬆。
![在這裏插入圖片描述](https://img-blog.csdnimg.cn/20210202131819147.jpg?#pic_center)
- **爲什麼受傷的總是我**
在開發者與***者的角逐中,受影響最大的莫過於我們用戶了。各種千奇百怪的複雜驗證碼,不是爲了考驗***,而是考驗用戶。
驗證碼的圖片常常扭曲得連人眼都認不出來。這在那些無實義的字詞中體現得格外明顯,就像“rl10Ozirl”。裏面用的到底是小寫的字母“L”還是數字“1”?是數字“0”還是字母“O”?真正的用戶在使用途中真的是飽經磨難。。。“爲什麼受傷的總是我”。
- **浪費大家的寶貴時間**
據卡內基梅隆大學的研發小組估算,全球人口每天在這些煩人的屏障入口處所耗費的時間,累計可達15 w小時。有種新型的驗證碼——“多重驗證碼”(reCaptcha),至少是把這些時間用在了公共價值的創造上。你看到的圖片是一個從掃描不良的谷歌(微博)圖書中截取出來的模糊單詞;而你輸入該詞拼寫的過程,其實就是在協助谷歌處理、識別一段有效文本。
即便如此,我們這些守規矩的用戶,每天還是會浪費掉17年的時間。這簡直是對生命的可恥浪費。而用戶真正想要的是去掉這些額外的操作。
## ➤ 去掉圖片驗證碼我們用什麼
- **風控防火牆**
風控防火牆是近幾年研發出來的一種專門應用於原圖片驗證場景的替代品。它將完全取締原來的圖片驗證碼,將用戶體驗做到最好。在用戶完全無感的情況下來區分正常用戶與非正常用戶。通過AI立體防禦機制,實時防控。用戶再也不用擔心出現(“`驗證碼輸入錯誤!`”)的煩人提示了。
![在這裏插入圖片描述](https://img-blog.csdnimg.cn/20210202134949919.png?t_70)
## ➤ 如何使用風控防火牆
### 第一步:獲取防火牆帳號密鑰
進入 [防火牆控制檯](http://www.newxtc.com/solution.php?id=11),在左側導航欄選擇【網站管理】,進入網站管理頁面,單擊【發到郵箱】接收密鑰。
![在這裏插入圖片描述](https://img-blog.csdnimg.cn/20210131105333374.png#pic_center)
### 第二步:下載防火牆服務器
前往[新昕科技官網](http://www.newxtc.com),在頂部導航欄選擇【[解決方案](http://www.newxtc.com/solution_category.php?parent_id=6)】>【[下載中心](http://www.newxtc.com/download_category.php?id=2&parent_id=6)】,進入下載中心頁面,找到短信防火牆服務器安裝包,點擊【[下載鏈接](http://www.newxtc.com/images/download/app.fire.sms.20210102.tar.gz)】即可下載。
### 第三步:業務系統前後端接入
#### web 前端接入:
Java 在頁面合適的位置(標籤內)加入以下代碼引入JS文件:
```javascript
<script type="text/javascript" src="/NxtJsServlet"></script>
```
PHP 在頁面合適的位置(標籤內)加入以下代碼引入JS文件:
```javascript
<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
- **短信下發**
```java
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;
}
```
- **短信驗證**
```java
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;
}
```
**PHP**
修改配置文件(和業務系統同系統不需要修改):
> nxt_ini.php (存放位置:"\nxt_inc") 修改參數(\$GLOBALS
> ["fireWareUrl"])-->$GLOBALS["fireWareUrl"]="http://localhost:7502"
- **短信下發**
```php
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);
}
}
}
```
* **短信驗證**
```php
/**
* 短信驗證
* @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模型情況。
進入[防火牆控制檯](https://www.newxtc.com:9000),在左側導航欄選擇【風險大盤】,進入風險大盤頁面。
![在這裏插入圖片描述](https://img-blog.csdnimg.cn/20210131112403342.png?#pic_center)
## ➤結語
這篇文章到這裏就結束了,感謝大佬們駐足觀看,大佬們點個關注、點個讚唄~
謝謝大佬~
![在這裏插入圖片描述](https://img-blog.csdnimg.cn/20201218114937265.jpg?#pic_center)
---
作者:香芋味的貓丶