大連仟億科技友情提供:http://www.billionnet.net
使用PHP對(duì)網(wǎng)站驗(yàn)證碼進(jìn)行破解
驗(yàn)證碼的功能一般是防止使用程序惡意注冊(cè)、暴力破解或批量發(fā)帖而設(shè)置的。所謂驗(yàn)證碼,就是將一串隨機(jī)產(chǎn)生的數(shù)字或符號(hào),生成一幅圖片,圖片里加上一 些干擾象素(防止OCR),由用戶肉眼識(shí)別其中的驗(yàn)證碼信息,輸入表單提交網(wǎng)站驗(yàn)證,驗(yàn)證成功后才能使用某項(xiàng)功能。學(xué)習(xí)驗(yàn)證碼的破解/識(shí)別技術(shù),不僅可以 知道驗(yàn)證碼的原理,而且可以讓你知道怎樣才能防止驗(yàn)證碼被破解。
最常見的驗(yàn)證碼主要有以下幾種:
為簡(jiǎn)單起見,破解說明主要針對(duì)是第2種類型的,先來看看網(wǎng)上常見的這種驗(yàn)證碼的圖片:
驗(yàn)證碼識(shí)別一般分為以下幾個(gè)步驟:
使用目前這種方法,對(duì)驗(yàn)證碼的識(shí)別基本上可以做到100%。
通過以上步驟,您可能說了,并沒有發(fā)現(xiàn)如何取出干擾素啊!其實(shí)取出干擾素的方法很簡(jiǎn)單,干擾素的一個(gè)重要特征是,不能影響驗(yàn)證碼的顯示效果,所以制 作干擾素時(shí)它的RGB可能低于或者高于某個(gè)特定值,比如我給的例子中的圖片,干擾素的RGB各項(xiàng)值是不會(huì)超過125的,所以,這樣我們就很容易去掉干擾素 了。
簡(jiǎn)單的驗(yàn)證碼只有數(shù)字和字母組成,格式統(tǒng)一,每次出現(xiàn)位置固定。下面繼續(xù)深入研究識(shí)別驗(yàn)證碼,這次需要識(shí)別的目標(biāo)是:驗(yàn)證碼有字符和數(shù)字組成,驗(yàn)證碼存在旋轉(zhuǎn)(可能左右都旋轉(zhuǎn)),位置不固定,存在字符與字符之間的粘連,且驗(yàn)證碼有更強(qiáng)的干擾素。
我們以下圖為例進(jìn)行講解。
第一步:二值化。把驗(yàn)證碼的部分用 1 表示,背景部分用 0 表示出來,識(shí)別方法很簡(jiǎn)單,我們打印出驗(yàn)證碼整 張圖片的 RGB ,然后分析其規(guī)律即可,通過 RGB 碼,我們很容易分辨出上面這張圖片的 R 值大于 120 , G 和 B 的值小于 80 , 所以依據(jù)這個(gè)規(guī)則我們很容易把上面的圖片二值化。
再來看看上面的第三種驗(yàn)證碼圖片
剛看上去,感覺很復(fù)雜。驗(yàn)證碼的圖片每次背景色都不相同,且不是單色,各個(gè)驗(yàn)證碼數(shù)字的顏色每次也各不相同。貌似很難二值化,其實(shí)我們打印出其 RGB 值很容易就發(fā)現(xiàn)。無論驗(yàn)證數(shù)字顏色如何變化,該數(shù)字的 RGB 值總有一個(gè)值小于 125 ,所以通過如下判斷 $rgbarray['red'] < 125 || $rgbarray['green']<125|| $rgbarray['blue'] < 125 我們就很容易分辨出哪里是數(shù)字,哪里是背景。
我們能夠找到這些規(guī)律的原因是,在制作驗(yàn)證碼的干擾素時(shí),為了使干擾素不影響數(shù)字的顯示效果,必須使用干擾素的 RGB 和數(shù)字 RGB 相互獨(dú)立,互不干擾。只要懂得這個(gè)規(guī)律,我們就很容易實(shí)現(xiàn)二值化。
我們找到的 120 , 80 , 125 等閾值,可能和實(shí)際的 RGB 有出入,所以,有時(shí)二值化后,會(huì)有部分地方出現(xiàn) 1 ,對(duì)于驗(yàn)證碼上固 定位置顯示數(shù)字,這種干擾沒有太大意義。但是對(duì)于驗(yàn)證碼位置不確定的圖片來說,在我們切割字符時(shí),很可能造成干擾。所以,在二值化后要進(jìn)行去噪處理。
第二部:去噪處理。去噪的原理很簡(jiǎn)單,就是把孤立的有效的值去掉,如果噪點(diǎn)比較高,要求的效率也比較高的話,這 里面也有很多工作要做。幸好這里我們不要求這么高深,我們使用最簡(jiǎn)單的方法就可以,如果一個(gè)點(diǎn)為 1 則判斷這個(gè)點(diǎn)的上下左右上左上右下左下右 8 個(gè)方 位上數(shù)字是否為 1 ,如果不為 1 ,就認(rèn)為是一個(gè)燥點(diǎn),直接設(shè)置為 1 即可。
如上圖所示,我們使用此方法很容易發(fā)現(xiàn)紅色方框部分的 1 為燥點(diǎn),直接設(shè)置為 1 即可。在判斷時(shí)我們使用了一個(gè)技巧,有時(shí)候的噪點(diǎn)可能是兩個(gè)連續(xù)的 1 ,所以我們計(jì)算這個(gè)點(diǎn)的 8 個(gè)方向上的值之和,最后我們判斷他們的和是否小于特定的閾值。
第三部:切割字符。切割字符的方法有很多種,這里采用最簡(jiǎn)單的一種,先垂直方向切割成為字符,然后在水平方向去掉多于的 0000 ,如下圖
第一步切割紅線部分,第二步切割藍(lán)線部分,這樣就可以得到獨(dú)立的字符了。但是像下面這種情況
按上面的方法會(huì)把 dw 字符切割成一個(gè)字符,這是錯(cuò)誤的切割,所以這里我們涉及到粘連字符的切割。
第四步:粘連字符切割。制作驗(yàn)證碼時(shí),規(guī)則字符的粘連很容易分割開,如果字符本身有縮放,變形就很難處理,經(jīng)過 分析,我們可以發(fā)現(xiàn),上面的字符粘連屬于很簡(jiǎn)單的方式,只是規(guī)則字符的粘連,所以處理這種情況,我們也使用很簡(jiǎn)單的處理方式。當(dāng)完成分割操作后,我們不能 馬上確定分割的部分就為一個(gè)字符,要進(jìn)行驗(yàn)證,驗(yàn)證的關(guān)鍵因素就是,切割下來的字符的寬是否大于閾值,這個(gè)閾值的取舍標(biāo)準(zhǔn)是,一個(gè)字符無論怎么旋轉(zhuǎn)變形都 不會(huì)大于這個(gè)閾值,所以,如果我們切割的塊大于這個(gè)閾值,就可以認(rèn)為這是一個(gè)粘連字符;如果大于兩個(gè)閾值之和,就認(rèn)為是三個(gè)字符粘連,以此類推。知道這個(gè) 規(guī)則后,切割粘連字符也就很簡(jiǎn)單了。如果我們發(fā)現(xiàn)是粘連字符塊,直接平分這個(gè)塊為兩個(gè)或者多個(gè)新的塊就可以。當(dāng)然為了更好的還原字符,我一般都采用平 分 +1 , -1 對(duì)字符塊的部分進(jìn)行適當(dāng)?shù)难a(bǔ)充。
第五步:匹配字符。對(duì)于旋轉(zhuǎn)字符的特征碼建立,有很多種方法,這里就不做深入研究了。我這里使用的最簡(jiǎn)單的方 式,為所有字符的所有情況建立匹配庫(kù),所以在我提供的代碼種增加了 study 操作,其目的就是,先有人手工識(shí)別圖片的驗(yàn)證碼,然后通 過 study 方法,寫入特征碼庫(kù)。這樣寫入的圖片數(shù)據(jù)越多,驗(yàn)證識(shí)別的準(zhǔn)確行也就越高。
經(jīng)過以上步驟,我們基本上可以識(shí)別現(xiàn)在互聯(lián)網(wǎng)上大部分的驗(yàn)證碼,這里我們都是使用的最簡(jiǎn)單的方法,沒有使用任何 OCR 知識(shí)。
另外制作驗(yàn)證碼的一些建議:
對(duì)于識(shí)別驗(yàn)證碼的程序來說,最難得部分是驗(yàn)證字符的切割和特征碼的建立,而國(guó)內(nèi)很多程序員只做驗(yàn)證碼時(shí),總是喜歡在驗(yàn)證碼加很多干擾素,干擾線,影響效果不說,還達(dá)不到很好的效果;所以,要想使自己驗(yàn)證碼難于本識(shí)別,只做下面兩點(diǎn)就夠了
只要做到這兩點(diǎn),或者這兩點(diǎn)的變形,識(shí)別程序就很難識(shí)別。具體參考Google的驗(yàn)證碼即可
大連仟億科技、大連網(wǎng)站建設(shè)、大連網(wǎng)站制作、大連網(wǎng)頁(yè)制作、大連網(wǎng)頁(yè)設(shè)計(jì)、大連網(wǎng)站設(shè)計(jì)、大連網(wǎng)站推廣、大連軟件開發(fā)、大連網(wǎng)絡(luò)公司
Copyright@ 2011-2016 版權(quán)所有:大連千億科技有限公司 遼ICP備11013762-3號(hào) google網(wǎng)站地圖 百度網(wǎng)站地圖 網(wǎng)站地圖
公司地址:大連市沙河口區(qū)中山路692號(hào)辰熙星海國(guó)際2317 客服電話:0411-39943997 QQ:2088827823 37482752
法律聲明:未經(jīng)許可,任何模仿本站模板、轉(zhuǎn)載本站內(nèi)容等行為者,本站保留追究其法律責(zé)任的權(quán)利! 隱私權(quán)政策聲明