漫話驗證碼緣起,程式原理及其他

來源:互聯網
上載者:User
程式|驗證碼|驗證碼 註:本文中很多資源來源於Internet,著作權和本文作者無關,僅僅引用。

現在,網站上登入,發表評論。。。。。。。。是個輸入框下都有請輸入驗證碼,泡網的人啊,都輸入過。如果你想瞭解驗證碼的作用,請先自己Google一下;如果你想製作自己的驗證碼程式,比如Asp(Asp.net)的,Php的,Jsp的。。。。。。。等等你也可以先Goolge一下。如果你想欣賞一下驗證碼長什麼樣的,那好,不用先Google了,看看我找得幾個網站的驗證碼。
1.欣賞驗證碼
我見到的第一個驗證碼:8723,隨機的一數字字串,最原始的驗證碼,驗證作用幾乎為零,呵呵。
CSDN網站使用者登入用的: ,GIF格式,目前常用的隨機數字圖片驗證碼。圖片上的字元比較中規中矩,驗證作用比上一個好。沒有基本圖形映像學知識的人,不可破!可惜讀取它的程式,在CSDN使用它的第一天,好像就在論壇裡發布了,真是可憐!
QQ網站使用者登入用的: ,PNG格式,圖片用的隨機數字+隨機大寫英文字母,整個構圖有點張揚,每重新整理一次,每個字元還會變位置呢!有時候出來的圖片,人眼都識別不了,厲害啊…
MS的hotmail申請時候的: ,BMP格式, 隨機數字+隨機大寫英文字母+隨機幹擾像素+隨機位置+???,這個就讓你服氣了吧……..不愧是MS老大啊.如果你看不清楚上邊的字元了,還可以點下邊連結,聽語音的讀取(註:沒有隨機背景雜訊幹擾的,只是TTS語音)。這個倒是很體貼使用者!
Google的Gmail註冊時候的: JPG格式,隨機英文字母+隨機顏色+隨機位置+隨機長度(?)+??,呵呵,看起來不錯。。。
找了幾個,都找累了,最後給大家貼一個很強的驗證碼字元,是GMAIL的:
 
(特別說明:這是Javaeye中別人發的,不要誤認為是我碰到的,汗啊!!)
欣賞完了這些驗證碼,那這些驗證碼有什麼用呢,不知道去Google的同學結果怎麼樣?
2.驗證碼作用分析
我Copy一段MS在Passport協助中的話:
鍵入圖片中的字元有助於確保是普通使用者而不是自動化的程式在填寫註冊表單。 
這一點很重要,因為攻擊者會使用有害程式註冊大量的 Web 服務帳戶(如 Passport)。攻擊者可以使用這些帳戶為其他的使用者製造麻煩,如發送垃圾郵件或通過同時反覆登入多個帳戶來延緩服務的速度。
在大多數情況下,自動註冊程式不能識別此圖片中的字元。
簡單的說呢,就是防止攻擊者編寫程式,自動註冊,重複登入暴力破解密碼。。。。。。,
驗證碼實現流程:伺服器端隨機產生驗證碼字串,儲存在記憶體中,並寫入圖片,發送給瀏覽器端顯示,瀏覽器端輸入驗證碼圖片上字元,然後提交伺服器端,提交的字元和伺服器端儲存的該字元比較是否一致。一致就繼續,否則返回提示。
攻擊者編寫的robot程式,很難識別驗證碼字元,順利的完成自動註冊,登入。。。。。。。。。而使用者可以識別填寫,所以這就實現了阻擋攻擊的作用。
特別說明的是,其實robot製作者也可以去識別驗證碼的,所以我說第一種直接輸出字元的驗證效果幾乎為零。而圖片的字元識別,就是看圖片上的幹擾強度了。
就實際的效果來說,驗證碼只是增加攻擊者的難度,而不可能完全的防止。
不過,無論怎麼說,為了系統更安全,採用驗證碼也是一種措施,那麼怎麼編寫驗證碼程式呢,相信Google一下,就有很多現成的代碼吧。

3.程式原理
   通過上邊的分析,特別是流程分析,相信寫出代碼是很容易的事情。比如目前流行的實現:
服務端檔案名稱: imgcode.*
虛擬碼:
隨機碼產生à1.存入Session(“code”)
2.調用繪圖函數或是直接寫2進位圖片格式,記憶體中產生圖片

用戶端檔案名稱:login.htm
虛擬碼:
<form  name=”login” action=”check” >
<input type=”text” name=”checkcode” value=”” /><img src=”imgcode.*”/>
</form>
服務端檔案名稱:checekcode.*
虛擬碼:
if 擷取用戶端checkcode的值=Session(“code”)
{
 ok
}
else
{
err
}
基本的實現就是這樣了,其實就是驗證碼圖片的產生部分,校正部分。為了加強防偽碼的作用,關鍵的地方是加入幹擾,圖片產生。
4.驗證碼中映像技術討論
 目前流行的WEB程式開發伺服器端技術中,很多都有繪圖的API函數,產生圖片的代碼也就很簡單了,就不多提了。這裡用沒有內建繪圖函數Asp,討論根據已知圖片格式,寫入2進位資料,產生圖片,先亂彈點圖形映像的東西。
我們看下圖:
  1111011111
1100011111
1111011111
1111011111
1111011111
1111011111
1111011111
1111011111
1111011111
1100000111
如果我們把上邊的0和1的位置想成彩燈,0表示燈亮,1表示等滅,那麼變成下圖:

1111011111
1100011111
1111011111
1111011111
1111011111
1111011111
1111011111
1111011111
1111011111
1100000111
0所在位置群組成了一個”1”字。如果在電子技術上,上圖就可以看成一個10x10的點陣。同樣的,顯示屏也可以看作一個個的點組成。我們輸出一組01的訊號,明暗相間組成一個映像,就是最簡單的黑白位元影像。簡單的顯示原理就是這樣了。
假想有一個人在控制一組10*10的燈,他利用燈的明暗來顯示一個“1”字,那麼他用什麼樣的順序依次開燈呢。將燈分成水平方向和豎直方向,從左下角的第一個開始,先左到右水平方向控制燈,一行完成後,再向上,依次進行,最後到達右上方結束。
   在電子技術上,我們把這樣的動作成為行掃描和場掃描,對應描述的行頻和場頻(重新整理頻率)就是衡量顯像管好壞的重要指標(跑題???)。如果我們用程式控制在螢幕的一塊地區(映像大小)中按上邊的掃描方法,根據這樣一串2進位 字元“1111011111110001111111110111111111011111111101111111110111111111011111111101111111110111111100000111”,將0的位置用白色顯示,其他的位置則是黑色,那麼我們就輸出了一個黑底白字的“1”的映像。當然,如果在windows中顯示映像,還要遵循映像的格式標準,否則是無法被系統識別的,所以還要加上表示映像格式本身的資訊(映像頭)。
囉嗦了這麼多,我們來看一個具體的產生BMP格式驗證碼的代碼(本代碼是根據網上的一個代碼簡化的,著作權歸原作者):
產生驗證圖片檔案:checkcode.asp
<%
’本代碼來源網上代碼
’著作權歸原作者
’為說明原理去掉了雜點產生 
’本人不負任何責任
Call Com_CreatValidCode() 
Sub Com_CreatValidCode() 
’ 禁止緩衝 
Response.Expires = -9999  
Response.AddHeader "Pragma","no-cache" 
Response.AddHeader "cache-ctrol","no-cache" 
Response.ContentType = "Image/BMP" 
Randomize 
Dim i, ii, iii 
Const cAmount = 36 ’ 文字數量 
Const cCode = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" 
’ 顏色的資料(字元,背景) 
Dim vColorData(2) 
vColorData(0) = ChrB(0) & ChrB(0) & ChrB(0)  ’ 藍0,綠0,紅0(黑色)0的位置顏色 
vColorData(1) = ChrB(255) & ChrB(255) & ChrB(255) ’ 藍250,綠236,紅211(白色) 1的位置顏色
’ 隨機產生字元 
Dim vCode(4), vCodes 
For i = 0 To 3 
  vCode(i) = Int(Rnd * cAmount) 
  vCodes = vCodes & Mid(cCode, vCode(i) + 1, 1) 
Next 
session("CheckCode") = vCodes  ’記錄入Session 
’ 字元的資料 
Dim vNumberData(36) 
vNumberData(0) = "1110000111110111101111011110111101001011110100101111010010111101001011110111101111011110111110000111" 
vNumberData(1) = "1111011111110001111111110111111111011111111101111111110111111111011111111101111111110111111100000111" 
vNumberData(2) = 



相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

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

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