提供便宜比價,省荷包,輕鬆消費讓生活更美好
免費刊登企業資訊,提高網站的曝光率,歡迎免費諮詢!
地坪工程系統傢俱免費丈量設計,客製化系統傢俱
工廠直營超低價,充分滿足居家空間機能需求

首頁  •  tw 論壇 • 程式設計討論     • 

解密驗証碼技術

房東:小優
發表時間:2007-04-10
[檢舉]


能說說那驗証碼為什麼不能顯示,你在論壇只說了解決方法。
我很想知道其中原由。
能說說嗎?


答︰這是個時政問題啊,呵呵.目前,不少網站為了防止用戶利用機器人自動註冊、登錄、灌水,都採用了驗証碼技術。所謂驗証碼,就是將一串隨機產生的數字或符號,生成一幅圖片, 圖片裡加上一些干擾象素(防止OCR),由用戶肉眼識別其中的驗証碼訊息,輸入表單提交網站驗証,驗証成功\後才能使用某項功\能。這不,我們軍團論壇,也搞這個把戲了.搞得昨天晚上,我都不能發帖,營運了幾次補丁,然後重新啟動ie依然看不見驗証碼,懷疑我的機器安全措施太高,果然發現我禁止修改註冊表.改禁後,問題依然,沒有辦法,只好手工了.問題得解.
  很多朋友對驗証碼有疑問,各大論壇的用戶也對驗証碼十分討厭,覺得麻煩,下面我們來解密這個東東.還是我的風格,通俗透徹,一分為幾,逐步解答.下面我們開始︰
 最初的驗証碼,只是幾個隨機生成的數字。但是道高一尺魔高一丈,很快就有能識別數字的軟體了,“收藏家”們利用這種軟體批量獲取帳號,或是探測密碼,因為軟體可以不知疲倦地不斷submit。於是,出現了圖片形式的驗証碼,還要加上無規則的背景,既然人眼都難以分辨,想來軟體分辨起來就有一定的難度。但是騰訊開始採用漢字圖片做驗証碼,是不是意味著破解驗証碼的技術又有了新進展,帶背景的數字或字母圖片形式的驗証碼,也可以被軟體分辨了?
值得說明的是︰驗証碼不同於註冊碼,註冊碼是軟體作者根據提交的機器碼透過特殊算法算出的,能讓軟體正常營運的密碼。


一.常見的驗証碼
1,四位數字,隨機的一數字字元串,最原始的驗証碼,驗証作用幾乎為零。

2,CSDN網站用戶登錄用的是GIF格式,目前常用的隨機數字圖片驗証碼。圖片上的字符比較中規中矩,驗証作用比上一個好。沒有基本圖形圖像學知識的人,不可破﹗可惜讀取它的程式,在CSDN使用它的第一天,好像就在論壇裡發布了,真是可憐﹗

3,QQ網站用戶登錄用的是PNG格式,圖片用的隨機數字+隨機大寫英文字母,整個構圖有點張揚,每刷新一次,每個字符還會變位置呢!有時候出來的圖片,人眼都識別不了,厲害啊…

4,MS的hotmail申請時候的是BMP格式, 隨機數字+隨機大寫英文字母+隨機干擾像素+隨機位置。

5,Google的Gmail註冊時候的是JPG格式,隨機英文字母+隨機顏色+隨機位置+隨機長度。

6,其他各大論壇的是XBM格式,內容隨機。

二.驗証碼作用分析

驗証碼起源︰因為攻擊者會使用有害程式註冊大量的 Web 服務帳戶(如 Passport)。攻擊者可以使用這些帳戶為其他的用戶製造麻煩,如發送垃圾郵件或透過同時反覆登錄多個帳戶來延緩服務的速度。在大多數情況下,自動註冊程式不能識別此圖片中的字符。簡單的說呢,就是防止攻擊者編寫程式,自動註冊,重複登錄暴力破解密碼。驗証碼技術應運而生。

驗証碼實現流程︰伺服器端隨機生成驗証碼字元串,儲存在內存中,並寫入圖片,發送給瀏覽器端顯示,瀏覽器端輸入驗証碼圖片上字符,然後提交伺服器端,提交的字符和伺服器端儲存的該字符比較是否一致。一致就繼續,否則返回提示。攻擊者編寫的robot程式,很難識別驗証碼字符,順利的完成自動註冊,登錄。。。。。。。。。而用戶可以識別填寫,所以這就實現了阻擋攻擊的作用。而圖片的字符識別,就是看圖片上的干擾強度了。就實際的效果來說,驗証碼只是增加攻擊者的難度,而不可能完全的防止。

1,論壇中的驗証碼的作用
目前,不少網站為了防止用戶利用機器人自動註冊、登錄、灌水,都採用了驗証碼技術。所謂驗証碼,就是將一串隨機產生的數字或符號,生成一幅圖片,圖片裡加上一些干擾象素(防止OCR),由用戶肉眼識別其中的驗証碼訊息,輸入表單提交網站驗証,驗証成功\後才能使用某項功\能。
因為你的WEB站有時會碰到客戶機惡意攻擊,其中一種很常見的攻擊手段就是身分欺騙它透過在客戶端腳本寫入一些代碼,然後利用其客戶機在網站論壇反覆登陸,或者攻擊者創建一個HTML窗體,其窗體如果包含了你註冊窗體或發帖窗體等相同的字段,然後利用\"http-post\"傳輸數據到伺服器,伺服器會執行相應的創建帳戶,提交垃圾數據等操作,如果伺服器本身不能有效驗証並拒絕此非法操作,它會很嚴重耗費其系統資源,降低網站性能甚至使程式崩潰.
而現下流行的判斷訪問WEB程式是合法用戶還是惡意操作的模式,就是採用 一種叫 \"字符校驗\"的技術.WEB網站像現下的動網論壇,他採用達到方法是為客戶提供一個包含隨即字元串的圖片,用戶必須讀取這些字元串,然後隨 登陸窗體或者發帖窗體等用戶創建的窗體一起提交.因為人的話,可以很容易讀出圖片中的數字,但如果是一段客戶端攻擊代碼,透過一般手段是很難識別驗証碼的.這樣可以確保當前訪問是來自一個人而非機器.
編程實現原理︰使用某種動態編程語言,比如PHP,ASP,隨即生成一個隨機數,大多為4位數字和字母,或者是數字和字母的組合,生成以後,用GD庫的支援生成一張根據隨機數來確定的圖片,把隨機數寫入到session中,傳遞到要驗証的頁面,生成的圖片顯示給登陸著,並要求登陸者輸入該隨機數內容,提交到驗証頁面,驗証session的內容和提交的內容是否一致,這就是大致的思路!那麼怎么\編寫驗証碼程式呢,相信Google一下,就有很多現成的代碼。

2,申請QQ號時候驗証碼的作用

如今你要申請一個QQ號,需要輸入很複雜的驗証碼︰驗証碼由若干個漢字組成,還加上了花哩唬哨的背景,使得有些漢字實在難以辨認。騰訊這么\做,是為了防止有人利用軟體批量獲取QQ號碼----每次提交都要輸入隨機生成的驗証碼,這是軟體難以做到的。

三.圖片驗証碼技術之一︰利用Xbm格式圖片
生成驗証代碼的技術有很多,這裡只說與我們論壇有關係的這項技術。
x-xbitmap格式的圖片(以下簡稱為Xbm格式)特殊,就在於它並不跟gif,jpg等圖片格式一樣,是一個真正的純2進製圖片格式,而是ascii碼檔案--換句話說,它是一個純文本檔案,在Windows系統下,系統瀏覽器將它翻譯成圖片來進行顯示。
下面讓我們先來製作一個Xbm圖形格式圖片︰
  新建一個文本檔案,將以下內容複製進去︰
  #define counter_width 48
  #define counter_height 9
  static unsigned charcounter_bits[]={ff,3c,7c,3c,70,3c,fe,7c,fe,7c,78,7c,ee,ee,ee,ee,7c,ee,e0,ee,60,ee,74,ee,70,fe,30,
fe,70,fe,38,ec,e0,ec,70,ec,1c,e0,ee,e0,70,e0,fe,7e,fe,7e,70,7e,fe,3c,7c,3c,70,3c}
  然後,將此文本檔案儲存為名字為 test.Xbm的檔案。
  接下來,讓我們看看如果在ie中打開它,會出現什麼情形??(新開一個ie,然後將test.Xbm直接拖拽到它上面),哈,出現了如下圖一樣的情景,在瀏覽器中出來的,已經不是我們的文本,而是一個黑白的圖片了﹗
  讓我們看看上面那代碼中,每一行的意義︰
   #define counter_width 48 這裡定義了圖片的寬度,一般都設定為8的整數倍,因為我們想顯示的是6個數字,所以就設定成了8*6=48的寬度
  #define counter_height 9 這裡設定了圖片的高度,可以任意設定,但是注意,這裡的數字直接決定了下面的數組中,是用幾組數來表示一個顯示出的數字
  static unsigned char counter_bits[]={7c,3c,7c,3c,70,3c,fe,7c,fe,7c,78,7c,ee,ee,ee,ee,7c,ee,e0,ee,60,ee,74,ee,70,fe,30,
fe,70,fe,38,ec,e0,ec,70,ec,1c,e0,ee,e0,70,e0,fe,7e,fe,7e,70,7e,fe,3c,7c,3c,70,3c}
  在這裡,是圖片用來顯示內容的十六進製的代碼,在這裡,是9*6=54個數字來表示,值得一提的是,由於在圖片顯示中,是顯示完了一行後,再顯示第2行,直到最後一行,因此更為準確的描述是6*9顯示,每6個數表示一行(因為我們顯示了6個數字),一共9行(我們的定義中,是採用的高度為9的數組)
  正如static unsigned char英文意思為靜態的,無符號的,燒焦的。它只能用來顯示黑白兩種顏色。二進製中的1將來用顯示為黑色,0為白色。
  因此,上面的7c、3c這樣的數字,就是一個256位的2進製,其中的1表示黑色,0表示白色,由此繪製出每個數字的圖形。
  由於Xbm檔案的性質決定,它只能顯示黑/白兩種顏色,而且以數組的模式來表現每個要顯示的圖形,注定了不能用它生成太複雜的圖案。那麼,這樣的圖片格式到底有什麼用呢??當然有的,不少asp論壇/聊天室的登陸驗証碼,就是用這樣的方法在asp中動態生成的。

四.為什麼要打補丁才能正常顯示呢?
在WindowsXP SP2更改後的安全策略中,因為基於安全原素的考慮,預設去掉了對 image/x-xbitmap 圖片格式的支援(該圖片的後綴名為Xbm)。,為什麼微軟在XP的SP2升級包中又要禁止掉它呢??這是因為Xbm的漏洞。
  Microsoft Internet EXPlorer和Outlook EXPress在處理WEB頁,HTML郵件,EMAIL附件中畸形Xbm圖象檔案會導致崩潰,問題存在於對Xbm檔案中的內容缺少檢查,MSIE按照圖象規定的長度和寬度分發內存,攻擊者可以提升超大的長度和寬度數值導致系統消耗內存或者訪問衝突。
  換句話說,如果構造一個長寬的尺寸特別大的Xbm檔案,很容易導致Windows的內存耗盡,導致程式無附應或者當機。本身來說,這不算一個特別嚴重的漏洞,因為根據安全公告,無法造成溢出,不會存在太大的權限漏洞。但是由於XP的SP2強調安全性,因此將Xbm功\能禁用了。從這點上可以看出,SP2對於安全的確比較重視,將有漏洞的功\能基本上都補上或禁用了,作為網路管理員,我對微軟的做法表示支援,因為作業系統預設設定的不安全,常常是造成非專業用戶被攻擊的首要原素。
  解禁方法︰
  由此看出,以後我們訪問某些採用生成Xbm作為驗証代碼的站點的時候,就相當不方便了,如果有必要,可以透過簡單的操作註冊表恢復我們需要的功\能。
  打開註冊表(開始---營運---regedit----返回),然後進到鍵值[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Internet EXPlorer\\Security]
將blockXbm的值改為00000000(dword,雙位元組),沒有的話新建立一個就可以了。
  之後重新IE或者重新啟動機器,則Xbm格式的圖片就可以看到了。

五,Xbm的趨勢
  從SP2禁止Xbm的趨勢看出,微軟打算似乎已經開始打算放棄對Xbm格式的支援了。那麼,作為程式編寫者,有必要未雨綢繆,尋找其他生成驗証碼的途徑。在php中,可以透過調用gd庫等模式生成jpg/gif等圖形格式的註冊驗証碼,那麼在asp中有其他的辦法么\?

  事實上圖片驗証密碼的關鍵是--不能在客戶端留下圖片的真實url,或可對應反推源位址的訊息,因此asp可以採用以下2種模式實現支援SP2的圖形驗証碼。

  如果是購買的虛擬主機,那麼可以採用將jpg/gif圖片放到數據庫,然後用session傳值的模式,最後利用asp直接從數據庫中輸出圖片,這方法的好處是不需要特別設定伺服器端,壞處則是每次生成驗証圖片時都會需要與數據庫連接,增加了開銷。

  如果是有管理員控制權限的用戶,可以考慮採用第三方組件來實現。天緣個人推薦 ASP圖象組件shotgraph ,它的免費版本對生成的圖形有一定限制,不過已經足夠用來製作驗証碼了。



  • 贊助網站       

    廣利不動產-新板特區指名度最高、值得您信賴的好房仲
    您的托付,廣利用心為您服務
    廣利不動產-板橋在地生根最實在--新板特區指名度最高、值得您信賴的好房仲
    完整房訊,房屋、店面熱門精選物件,廣利不動產 優質仲介,房屋租賃、買賣資訊透明,交易真安心!



  •  共 0 人回應

    姓名:
    佈告內容: