1. 程式人生 > 實用技巧 >Python實現圖片滑動式驗證識別

Python實現圖片滑動式驗證識別

1 abstract

很多人學習python,不知道從何學起。
很多人學習python,掌握了基本語法過後,不知道在哪裡尋找案例上手。
很多已經做案例的人,卻不知道如何去學習更加高深的知識。
那麼針對這三類人,我給大家提供一個好的學習平臺,免費領取視訊教程,電子書籍,以及課程的原始碼!
QQ群:1097524789

驗證碼作為一種自然人的機器人的判別工具,被廣泛的用於各種防止程式做自動化的場景中。傳統的字元型驗證安全性已經名存實亡的情況下,各種新型的驗證碼如雨後春筍般湧現。目前最常見的一種形式就是"滑動拼圖式"

2 內容概述

關於滑動式驗證,最早由國內某網路安全公司首次提出的行為式驗證,以滑動拼圖解鎖的方式呈現在世人面前。然後大概過了好幾年之後,各種各樣的滑動式驗證產品都出來了,那麼這些看似一樣的產品,它們的安全性到底如何呢?

本文特意挑選出了一些後來者的小廠商的滑動式驗證來做下實驗,僅從第一步的影象學上分析一下安全性。因為我的主技術路線是影象學,關於前端的js並不熟悉,所以就只在影象學上點到即止即可。僅供會一些自動化技術的同學提供一些知識補充吧。

由於研究的實驗物件實在是太簡單,所以本文涉及的一些影象學的知識也不難,基本上python的初級選手就可以跑通本程式。僅供大家學習學習。

3 研究物件

某小站點上由小廠商提供的"滑動式驗證":

使用python寫一個簡單的爬蟲自動化指令碼,將此網站上的驗證碼資源多請求幾次,並儲存到本地,觀查圖片特點。

一般情況下,這一步是必須的,多下載一些圖片,很多規律是可以一眼看出的。比如,從公開的頁面中,連續請求此驗證的資源 100次,下載100張圖片後。

一眼看上去,此驗證的圖片素材都只有一種模式,那麼就放心了,因為這個問題就比較單一,而不是多模式下你必須要解決多個問題。

4 定性分析

將這種單一模式的圖片篩選一張出來,如下:

發現如下特點:

和前端展示相關的圖片有:方塊位置提示圖A,小方塊B,完整背景圖C。

A圖完全是由B和C合成

顯然,設計這個驗證圖片的人沒啥安全方面的經驗,有如下兩個產品細節沒有注意:

對圖片沒做任何的特殊處理

對外公開提供了過多資訊

於是使得識別此圖片的位置變得極其簡單。

5 定量分析

在前面一小節中,我們只是直觀的看到了這些圖片的一些特別,但是要解答這個題目,還需要進行量化,量化後才能程式化,程式化後才能全自動化。

使用matplotlib工具開啟此圖片。量化得到如下引數:

圖片整體規格:w:240,h:450

由上到下分為三部分,每部分高度為150

6 求解圖片

很明顯,只要將第一張圖和第三張圖相應的畫素相減,神奇的事情就發生了:

"左上" 減去 "右下" 就得到 "左下"的結果。

這個時候,對x方向的R通道的畫素點進行累加統計。

得到如下的統計圖:

然後對這個曲線求一階導數或者只要發現有個突變值超過最大畫素值的某百分比時,即可得到最左邊的那個y方向突變點的位置。

到此為止,此圖片的位置已經成功解出。

下面是相應的python程式碼:


  1. import numpy as np

  2. ...

  3. def get_boundary(mask, axis, ratio=0.6):

  4. """

  5. 对ç°åº¦å¾çæ个channelååç´ ç»è®¡

  6. """

  7. sum_along_axis = np.sum(mask, axis=axis)

  8. max_value = np.max(sum_along_axis)

  9. bound_value = max_value * ratio

  10. bvalue = (sum_along_axis >= bound_value).astype('int8')

  11. return np.where(bvalue != 0)[0][0]

  12. def get_predict_ans(img):

  13. """

  14. æ ¹æ®åç±»åºæ¥çå¾åï¼æ¾å°ç¸åºçå¾åä½ç½®

  15. ä¼ å¥äºè¿å¶çå¾çï¼è¿åç­æ¡

  16. :param img:

  17. :return:

  18. """

  19. nd_img = np.array(img)

  20. w_pos = get_boundary(nd_img, 0) # æ ¹æ®åå¸å¾æ¾å°è¾¹çä½ç½®

  21. return w_pos

總結

以上所述是小編給大家介紹的Python實現圖片滑動式驗證識別方法,希望對大家有所幫助!