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

          導航

          常用鏈接

          留言簿(5)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          相冊

          顏色

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

           

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

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

          Asp文件:Code.Asp
          數據文件: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
          生成隨機四位數字:
          zNum = cint(8999*Rnd+1000)
          傳遞給session
          Session("GetCode") = zNum
          該for循環是將隨機數字放入一個下標3的數組,便于提供給后面的陣列變換
          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對象,作圖像數據操作之用:

          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的數字數據10x100的,Gbr的陣列數據,每個320字節,10個數字3200byte
          'BGR一個點,10x10個點一個數字,一個點三個字節(二進制8位,16進制 00~FF)
          '一行10個點 30字節 + 行結束標記 00 00 二字節 32字節,所以一個10x100寬小于長的圖像每個數字10x10是320字節
          '長大于寬的則無行結束標記 0000,直接是300字節
          這些就是BMP 24bit的數據詳細信息了
          ‘至于頭部,也很簡單,包含長寬,圖像開始標記等等~~才54字節,遠沒jpg什么的復雜

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



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

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


          網站導航:
           
           
          Copyright © 一天一點愛戀 Powered by: 博客園 模板提供:滬江博客
          主站蜘蛛池模板: 灵山县| 阿尔山市| 东丽区| 怀仁县| 乌什县| 泾源县| 宁阳县| 霍城县| 台南县| 杭州市| 厦门市| 会东县| 呼玛县| 滕州市| 康定县| 新密市| 浙江省| 舞钢市| 永泰县| 双江| 杭锦旗| 泊头市| 来安县| 黑龙江省| 贡山| 九龙城区| 余庆县| 罗平县| 屯留县| 康马县| 苍南县| 西畴县| 关岭| 定南县| 湟中县| 静海县| 苏州市| 鹤峰县| 古浪县| 阿鲁科尔沁旗| 隆尧县|