我的人生路  
          日歷
          <2005年7月>
          262728293012
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456
          統(tǒng)計
          • 隨筆 - 74
          • 文章 - 57
          • 評論 - 7
          • 引用 - 0

          導(dǎo)航

          常用鏈接

          留言簿(5)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          相冊

          顏色

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

           

          要讀懂這些代碼主要是要了解ASP中操作二進制數(shù)據(jù)的對象ADODB.Stream!本程序主要用的就是Adodb.Stream,如果你有這個基礎(chǔ),就可以進一步添加更多的功能如加入雜點,漸變底色,數(shù)字行列錯位,筆畫短點,提高被ocr識別的不可能。目前還沒有好的識別引擎,昨天下載了個號稱能識別圖像驗證碼90%的!把4321識別成 89910,所以圖像碼還是比較安全的。

          在網(wǎng)上看到有暴力破解的方法,如果我用圖像附加碼+禁止外部提交+10次密碼錯誤封帳號 +50次密碼錯誤瑣死IP+10秒的防刷新間隔注冊頁,登陸頁均要加上+禁止外部提交,這樣,暴力破解應(yīng)該就沒戲了。

          Asp文件:Code.Asp
          數(shù)據(jù)文件:body.Fix , Head.Fix
          用法:<img src="code.asp">

          Response.buffer = true
          NumCode

          Function NumCode()
          Response.Expires = -1
          Response.AddHeader "Pragma","no-cache"
          Response.AddHeader "cache-ctrol","no-cache"
          dim zNum,i,j
          dim Ados,Ados1
          Randomize timer
          生成隨機四位數(shù)字:
          zNum = cint(8999*Rnd+1000)
          傳遞給session
          Session("GetCode") = zNum
          該for循環(huán)是將隨機數(shù)字放入一個下標(biāo)3的數(shù)組,便于提供給后面的陣列變換
          dim zimg(3),NStr
          NStr=cstr(zNum)
          For i=0 to 3
          zimg(i)=cint(mid(NStr,i+1,1))
          Next
          dim Pos

          '定義二個 ADODB.Stream binary對象,作圖像數(shù)據(jù)操作之用:

          set Ados=Server.CreateObject("Adodb.Stream")
          Ados.Mode=3
          Ados.Type=1
          Ados.Open
          set Ados1=Server.CreateObject("Adodb.Stream")
          Ados1.Mode=3
          Ados1.Type=1
          Ados1.Open
          '載入0~9的數(shù)字?jǐn)?shù)據(jù)10x100的,Gbr的陣列數(shù)據(jù),每個320字節(jié),10個數(shù)字3200byte
          'BGR一個點,10x10個點一個數(shù)字,一個點三個字節(jié)(二進制8位,16進制 00~FF)
          '一行10個點 30字節(jié) + 行結(jié)束標(biāo)記 00 00 二字節(jié) 32字節(jié),所以一個10x100寬小于長的圖像每個數(shù)字10x10是320字節(jié)
          '長大于寬的則無行結(jié)束標(biāo)記 0000,直接是300字節(jié)
          這些就是BMP 24bit的數(shù)據(jù)詳細信息了
          ‘至于頭部,也很簡單,包含長寬,圖像開始標(biāo)記等等~~才54字節(jié),遠沒jpg什么的復(fù)雜

          Ados.LoadFromFile(Server.mappath("body.Fix"))
          Ados1.write Ados.read(1280)
          '第一個for循環(huán),按生成的隨機數(shù)字順序從 10X100的數(shù)字陣列中提取出相應(yīng)的四個數(shù)字
          但是豎排的數(shù)字陣列
          for i=0 to 3
          Ados.Position=(9-zimg(i))*320
          Ados1.Position=i*320
          Ados1.write ados.read(320)
          next
          '清空已經(jīng)用完的ADOS的數(shù)據(jù),調(diào)入替換新的圖像頭54字節(jié)的頭文件
          Ados.LoadFromFile(Server.mappath("head.fix"))
          Pos=lenb(Ados.read())
          Ados.Position=Pos '指定Pos位置,即可再偏移54字節(jié)的位置添加圖形數(shù)據(jù)
          第二個for循環(huán),進行數(shù)字的陣列變換,由豎排的塊轉(zhuǎn)換為橫排的數(shù)字塊
          方法是隔320字節(jié)抽取4次30字節(jié)寫入ados對象,再抽取偏移第二行的圖像數(shù)據(jù)
          30字節(jié)是因為bmp 寬大于長時無00 00的行結(jié)束標(biāo)記
          for i=0 to 9 step 1
          for j=0 to 3
          Ados1.Position=i*32+j*320
          Ados.Position=Pos+30*j+i*120
          Ados.write ados1.read(30)
          next
          next
          Ados.Position=0
          response.BinaryWrite直接向客戶端發(fā)送圖像數(shù)據(jù)
          Response.ContentType = "image/BMP"
          Response.BinaryWrite Ados.read()
          Ados.Close:set Ados=nothing
          Ados1.Close:set Ados1=nothing
          End Function



          歡迎大家訪問我的個人網(wǎng)站 萌萌的IT人
          posted on 2005-07-07 14:49 一天一點愛戀 閱讀(152) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
           
          Copyright © 一天一點愛戀 Powered by: 博客園 模板提供:滬江博客
          主站蜘蛛池模板: 山东| 磐安县| 辰溪县| 宜良县| 清徐县| 保康县| 江西省| 保靖县| 阳东县| 郁南县| 湘阴县| 宁明县| 南召县| 商水县| 七台河市| 江油市| 临沂市| 安阳县| 枣强县| 石泉县| 阿坝县| 磐石市| 天津市| 壶关县| 桑日县| 临邑县| 库尔勒市| 苍南县| 稻城县| 额尔古纳市| 新化县| 佛学| 浦江县| 泽库县| 承德市| 西峡县| 雷州市| 岳阳市| 巴中市| 江口县| 靖西县|