php製作的簡單驗證碼識別代碼_php執行個體

來源:互聯網
上載者:User

一直想寫這個,過了很久今天興趣來了索性記錄下。

驗證碼

全自動區分電腦和人類的公開圖靈測試(英語:Completely Automated Public Turing test to tell Computers and Humans Apart,簡稱CAPTCHA),俗稱驗證碼,是一種區分使用者是電腦和人的公用全Bot。在CAPTCHA測試中,作為伺服器的電腦會自動產生一個問題由使用者來解答。這個問題可以由電腦產生並評判,但是必須只有人類才能解答。由於電腦無法解答CAPTCHA的問題,所以回答出問題的使用者就可以被認為是人類。
百科介紹

說的簡單點就是隨機產生的字元,輸出在一張圖片上[這裡不考慮其他形式的拖拽/簡訊驗證碼等等]。

常見類型

思路

本文只做示範使用,故取第一張圖片驗證碼作為講解樣本。

圖片上的每一點都有其RGB值,通過色彩選擇工具可以擷取到,肉眼觀察可以看出該圖驗證碼是純數字純色背景

通過色彩選擇工具看出該驗證碼背景色RGB值為(212,214,204)

實現

下面我們來用PHP的imagecolorsforindex函數取得圖片所有點的RGB值:

$url = 'http://210.32.33.91:8080/reader/captcha.php';$im = imagecreatefromgif($url);imagegif($im, '1.gif');$rgbArray = array();$res = $im;$size = getimagesize($url);$wid = $size['0'];$hid = $size['1'];for ($i = 0; $i < $hid; ++ $i) { for ($j = 0; $j < $wid; ++ $j) {  $rgb = imagecolorat($res, $j, $i);  $rgbArray[$i][$j] = imagecolorsforindex($res, $rgb); }}

結果如下:

各位可能想問這有什麼用呢? 下面我們換一種方式來顯示資料,為背景色輸出,驗證碼地區輸出,再來看下:

for ($i = 0; $i < $hid; $i ++) { for ($j = 0; $j < $wid; $j ++) {    if ($rgbArray[$i][$j]['red'] == 212) {   echo '□';  } else {   echo '■';  } } echo "<br>";}

效果:

這樣一下是不是很清楚了。

但是你可能還是有疑問,儘管可以看出來了,但是如何知道是多少呢?

下面我們來分析下:


每個驗證碼直接間距4格,左右間距6/10格,上下間距16/10格。

我們再來去掉這些幹擾點,可以看得更清晰些:



是不是很清晰了?可能還是有人會問,你講這麼多到底要怎麼才能知道圖片上的數字是多少.

好吧,說下我的思路,我們將剛剛的換為0和1,而這些數字形狀是固定的,這樣就可以得到0-9每一個字的每一個地區8*10都有0和1組成了,

我們再來進行每8個切分,去掉4格間距,迴圈得出0-9的01組合值:

$dic = array( '00011000001111000110011011000011110000111100001111000011011001100011110000011000' => 0, '00011000001110000111100000011000000110000001100000011000000110000001100001111110' => 1, '00111100011001101100001100000011000001100000110000011000001100000110000011111111' => 2, '01111100110001100000001100000110000111000000011000000011000000111100011001111100' => 3, '00000110000011100001111000110110011001101100011011111111000001100000011000000110' => 4, '11111110110000001100000011011100111001100000001100000011110000110110011000111100' => 5, '00111100011001101100001011000000110111001110011011000011110000110110011000111100' => 6, '11111111000000110000001100000110000011000001100000110000011000001100000011000000' => 7, '00111100011001101100001101100110001111000110011011000011110000110110011000111100' => 8, '00111100011001101100001111000011011001110011101100000011010000110110011000111100' => 9);

得出這10個後組合成數組,每次解析圖片RGB換成對應數組值就得到驗證碼值了。下面來示範下:

最後為了準確性,取100個迴圈看看:

哈哈,準確率100%

寫在最後

本文的目的是為了讓WEB開發人員在產生驗證碼時注意安全,請勿用於非法目的.

代碼已在github:

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.