讓我們一起攻破世界上最流行的WordPress的驗證碼插件每個人都討厭驗證碼——在你被允許訪問一個網(wǎng)站之前,你總被要求輸入那些煩人的圖像中所包含的文本。驗證碼被設(shè)計成,以驗證你是一個真正的人的方式,來防止電腦自動填寫表單。但是隨著深度學(xué)習(xí)和計算機視覺的興起,它們現(xiàn)在往往很容易被攻破。我在讀Adrian Rosebrock的優(yōu)秀的著作《Python計算機視覺深度學(xué)習(xí)》。在書中,Adrian簡單地描述了他如何用機器學(xué)習(xí)繞過E-ZPass New York網(wǎng)站的驗證碼:
Adrian沒有訪問生成驗證碼圖片的應(yīng)用的源代碼的權(quán)限。為了破解這個系統(tǒng),他不得不下載成百上千個示例圖像并手動解答它們,用以訓(xùn)練他的深度學(xué)習(xí)系統(tǒng)。但是如果我們想打破一個開放源代碼的驗證碼系統(tǒng),將會怎么樣?我去wordpress.org插件注冊表搜索“驗證碼”。最靠前的結(jié)果是一個叫“真正簡單的驗證碼”的插件,有超過100萬個活躍安裝:
并且最好的一點是,它開源!因為我們有生成驗證碼的源代碼,那么這應(yīng)該是很容易破解的。為了讓事情更有挑戰(zhàn)性,讓我們給自己一個時間限制。我們是否能夠在15分鐘內(nèi)破解這個驗證碼系統(tǒng)?讓我們試試看!重要提示:這絕不是針對“真正簡單的驗證碼”這個插件或它的作者的批評。插件作者本人也說,這個插件不再安全,建議您使用其他東西。這只是一個快速而有趣的技術(shù)挑戰(zhàn)。但是如果你是剩下的100萬個用戶中的一個,也許你應(yīng)該切換到其他插件:)
挑戰(zhàn)開始
為了打造一個進攻計劃,讓我們先來看看這個插件會生成哪種類型的圖片。在演示站點上,我們看到這個:
好的,所以驗證碼圖像似乎是四個字母。讓我們在PHP源代碼中驗證這一點:
是的,它會產(chǎn)生一個四字母的驗證碼,并采用隨機組合的四種不同的字體。我們可以看到,它從不在代碼中使用“O”或“I”,以避免用戶混淆。這給了我們總共32個可能需要識別的字母和數(shù)字。沒問題!到目前為止時間過去:2分鐘。
我們的工具集
在我們進一步討論之前,讓我們說一下為了解決這個問題我們將會用到的工具:Python3Python是一種非常有趣的編程語言,它有很好的機器學(xué)習(xí)和計算機視覺庫。OpenCVOpenCV是一種流行的計算機視覺和圖像處理框架。我們將使用OpenCV來處理驗證碼圖像。它有一個Python應(yīng)用接口,因此我們可以直接從Python中使用它。KerasKeras是一個由Python寫的深度學(xué)習(xí)的框架。它可以使我們用最少的代碼,方便地定義、訓(xùn)練和使用深層神經(jīng)網(wǎng)絡(luò)。TensorFlowTensorFlow是谷歌的機器學(xué)習(xí)庫。我們會在Keras中寫代碼,但Keras并沒有真正實現(xiàn)神經(jīng)網(wǎng)絡(luò)的邏輯本身,它其實是在后臺調(diào)用谷歌的TensorFlow進行計算。好,現(xiàn)在讓我們回到挑戰(zhàn)!
創(chuàng)造我們的數(shù)據(jù)集
訓(xùn)練任何機器學(xué)習(xí)系統(tǒng),我們都需要訓(xùn)練數(shù)據(jù)集。破解一個驗證碼系統(tǒng),我們則需要訓(xùn)練數(shù)據(jù)看起來像這樣:
這是唯一我不會給你示例代碼的部分。我們這樣做是為了教育,我不想讓你真的去黑WordPress網(wǎng)站。不過,我會給你我最后生成的這10000張圖像,以便你可以重復(fù)我的結(jié)果。到目前為止時間過去:5分鐘。
簡化問題
現(xiàn)在我們有了訓(xùn)練數(shù)據(jù),我們可以直接用它來訓(xùn)練神經(jīng)網(wǎng)絡(luò):
有足夠的訓(xùn)練數(shù)據(jù),這種粗暴的方法甚至也行得通?-?但我們可以使問題更容易解決。問題越簡單,訓(xùn)練數(shù)據(jù)越少,計算資源消耗就越少。畢竟我們只有15分鐘!幸運的是,驗證碼圖像總是由四個字母組成。如果我們能用某種方式把圖像分割開來,這樣每一個字母都是一個獨立的圖像,那么我們只需要訓(xùn)練神經(jīng)網(wǎng)絡(luò)一次識別一個字母:
我沒有時間瀏覽10000個訓(xùn)練圖像,并在Photoshop中手動將它們分割成單獨的圖像。這將需要幾天,而我只剩下10分鐘了。而且我們不能將圖像分成四個相同大小的塊,因為驗證碼會將這些字母隨機放置在不同的水平位置:
每個圖像中的字母隨機放置,使分割圖像更難一些。
幸運的是,我們?nèi)匀豢梢宰詣訄?zhí)行此操作。在圖像處理中,我們經(jīng)常需要檢測具有相同顏色的像素團。這些連續(xù)像素團周圍的邊界被稱為輪廓。OpenCV有一個內(nèi)置的findContours()函數(shù),可以用來檢測這些連續(xù)的區(qū)域。那么我們將從一個原始的驗證碼圖像開始:
然后,我們將圖像轉(zhuǎn)換為純黑白(這稱為閾值設(shè)定),這樣就很容易找到連續(xù)的區(qū)域:
接下來,我們將使用OpenCV的findContours()函數(shù)來檢測圖像中各個包含相同顏色像素的連續(xù)團:
那么只需將每個區(qū)域保存為一個單獨的圖像文件即可。而且由于我們知道每個圖像應(yīng)該包含從左到右的四個字母,所以我們可以使用這些知識來標(biāo)記字母。只要我們按順序保存它們,我們能夠用適當(dāng)?shù)淖帜该Q保存每個字母圖像。但是等等 —— 我看到一個問題! 有時候驗證碼有這樣的重疊字母:
這意味著我們最終將提取將兩個字母拼湊在一起的區(qū)域:
如果我們不處理這個問題,我們最終會創(chuàng)建糟糕的訓(xùn)練數(shù)據(jù)。我們需要解決這個問題,以免我們不小心讓機器把這兩個相連的字母識別為一個字母。
我們將把任何寬度比高度還長的區(qū)域?qū)Π敕珠_,并把它當(dāng)作兩個字母。這是很粗暴,但這么處理對識別這些驗證碼依然行得通。
現(xiàn)在我們有了一種提取單個字母的方法,讓我們在所有的CAPTCHA圖像上運行它。目標(biāo)是收集每個字母的不同變化。我們可以將每個字母保存在自己的文件夾中。下面是我提取所有字母后,我的“W”文件夾的樣子:
從我們的10000個驗證碼圖像中提取的一些“W”字母。我一共得到了1147個不同的“W”圖像。到目前為止時間過去:10分鐘。
創(chuàng)建和訓(xùn)練神經(jīng)網(wǎng)絡(luò)
由于我們只需要識別單個字母和數(shù)字的圖像,我們不需要一個非常復(fù)雜的神經(jīng)網(wǎng)絡(luò)架構(gòu)。識別字母比識別諸如貓和狗的圖片這樣的復(fù)雜圖像要容易得多。我們將使用具有兩個卷積層和兩個完全連接層的簡單卷積神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu):
如果你想知道更多關(guān)于卷積神經(jīng)網(wǎng)絡(luò)是如何工作的,為什么他們被用作圖像識別非常理想,請查看Adrian的書或我以前的文章。用Keras定義這個神經(jīng)網(wǎng)絡(luò)體系結(jié)構(gòu)只需要使用幾行代碼:
現(xiàn)在,我們可以開始訓(xùn)練它了!
用訓(xùn)練數(shù)據(jù)集訓(xùn)練10次后,我們達到了近100%的準(zhǔn)確度?,F(xiàn)在,只要我們想,我們應(yīng)該能夠自動繞過這個驗證碼了!我們做到了!到目前為止時間過去:15分鐘。(~!)
使用訓(xùn)練的模型破解驗證碼
現(xiàn)在,我們有一個訓(xùn)練有素的神經(jīng)網(wǎng)絡(luò),用它來破解真正的驗證碼非常簡單:1.從使用該WordPress插件的網(wǎng)站抓取真實的驗證碼圖像。2.使用我們用來創(chuàng)建訓(xùn)練數(shù)據(jù)集的相同方法,將驗證碼圖像分解為四個單獨的字母圖像。3.要求我們的神經(jīng)網(wǎng)絡(luò)對每個字母圖像做一個單獨的預(yù)測。4.使用四個預(yù)測字母作為驗證碼的答案。5.愉快的玩耍吧以下是我們的模型如何解碼真正的驗證碼
或者從命令行
-
計算機視覺
+關(guān)注
關(guān)注
8文章
1688瀏覽量
45872 -
機器學(xué)習(xí)
+關(guān)注
關(guān)注
66文章
8320瀏覽量
132165 -
python
+關(guān)注
關(guān)注
54文章
4756瀏覽量
84284 -
深度學(xué)習(xí)
+關(guān)注
關(guān)注
73文章
5431瀏覽量
120790
原文標(biāo)題:Python破解驗證碼,只要15分鐘就夠了!
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論