主頁 > 知識庫 > 反SPAM新思路—換Z-BLOG的驗(yàn)證碼!

反SPAM新思路—換Z-BLOG的驗(yàn)證碼!

熱門標(biāo)簽:離線電子地圖標(biāo)注軟件注冊 為什么外呼系統(tǒng)需要預(yù)存話費(fèi)呢 外呼回?fù)芟到y(tǒng)圖片 企數(shù)外呼系統(tǒng)能用多久 辦理400電話一年多少錢 常用地圖標(biāo)注范圍點(diǎn) 蘭州智能語音電銷機(jī)器人功能 寧夏怎么申請400電話 咸陽銷售外呼系統(tǒng)
最近我們一些Z-BLOGGER都在想做個什么插件攔住SPAM,當(dāng)然解決方法也不是沒有,就是弄個超強(qiáng)的服務(wù)器,可惜搞不起。那……我們只好從SPAMMER的角度來想了。
  懂一些的人可能知道,SPAM軟件的基本原理是[搜索目標(biāo)]-進(jìn)入網(wǎng)站-掃描驗(yàn)證碼-OCR-[填寫表單]-POST。每一步我們都可以加以防范,比較現(xiàn)實(shí)的是防止SPAM軟件成功的OCR出驗(yàn)證碼。Z-BLOG自帶的驗(yàn)證碼實(shí)在有點(diǎn)弱,干擾點(diǎn)等于沒有,感覺可以輕易的分析出驗(yàn)證碼里的數(shù)字。解決方法就是——換一個驗(yàn)證碼程序。 
  這個驗(yàn)證碼程序(就是我現(xiàn)在用的)是從月光留言本里挖出來的,稍加修改,以便適應(yīng)Z-BLOG。個人認(rèn)為要編出軟件OCR這個驗(yàn)證碼是有點(diǎn)難度的,應(yīng)該可以換取片刻的安寧。當(dāng)然,這只是權(quán)宜之計,如果廣泛使用,勢必還會有高手來破解的。所以啊……最好官方能弄個服務(wù)器,有時候,我覺得商業(yè)化或是適當(dāng)引進(jìn)投資也是不錯的~
目前還在測試效果,3-28晚開始。到目前(07-03-30)為止共收到1個SPAM(包括被攔截的。),內(nèi)容和別的SPAM不一樣,應(yīng)該不是那個垃圾SEO網(wǎng)站的作品(很大膽的加了2個鏈接),而且不是提交在在一般搜索引擎搜索進(jìn)來的《google加了一個網(wǎng)頁惡意軟件檢測?》,而是在我的留言本。根據(jù)REFERER的結(jié)果應(yīng)該是從主頁過去的(也不排除從別的地方進(jìn)去而沒有執(zhí)行腳本或提交refer信息),懷疑為人工SPAM(UPDATE:Haphic也收到了一個同樣的。到底是不是人工的?他用的驗(yàn)證碼是原版的……),換驗(yàn)證碼的效果還需繼續(xù)觀察……

c_validcode.asp代碼
復(fù)制代碼 代碼如下:

%@ CODEPAGE=65001 %>
% Option Explicit %>

'On Error Resume Next
 %>
!-- #include file="../c_option.asp" -->
!-- #include file="../function/c_function.asp" -->
%

Response.buffer=true

Call Com_CreatValidCode("CheckCode")

Rem 生成驗(yàn)證碼圖片
Sub Com_CreatValidCode(pSN)
    Const codeLenMin = 5                '驗(yàn)證碼位數(shù)范圍
    Const codeLenMax = 5                '驗(yàn)證碼位數(shù)范圍
    Const cOdds = 2                         '雜點(diǎn)出現(xiàn)的機(jī)率
    Const dbtTimes = 1                    '干擾次數(shù)
    Const posX = 3                            '位置隨機(jī)范圍X
    Const posY = 2                            '位置隨機(jī)范圍Y
    ImgWidth = 60                            '圖像寬(要為4的倍數(shù))
    ImgHeight = 20                            '圖像高

    Const cAmount = 10                     '字庫數(shù)量
    Const cCode = "0123456789"    '字庫對應(yīng)的字符
    Const UnitWidth = 16                '字寬(要為4的倍數(shù))
    Const UnitHeight = 15                '字高
    Const DotsLimit = 10                '每次刪除有效點(diǎn)的上限(避免無法人為識別)
    Const tryCount = 5                    '避免刪除有效點(diǎn)超過上限的嘗試次數(shù)限制

    '-----------

    Randomize
    Dim i,ii,iii,flag,ActUnitWidth,ImgYuWidth,codeLen,ImgWidth,ImgHeight
    codeLen = codeLenMin + cint(Rnd*(codeLenMax-codeLenMin))
    If ImgWidth Mod 4 > 0 Or ImgWidth  codeLen*UnitWidth Then ImgWidth = codeLen*UnitWidth
    If ImgHeight  UnitHeight Then ImgHeight = UnitHeight

    ' 禁止緩存
    Response.Expires = -9999
    Response.AddHeader "Pragma","no-cache"
    Response.AddHeader "cache-ctrol","no-cache"
    Response.ContentType = "Image/BMP"

    ' 顏色的數(shù)據(jù)(字符,背景)
    Dim vColorData(1)
    vColorData(0) = ChrB(0)  ChrB(0)  ChrB(0)  ' 藍(lán)0,綠0,紅0(黑色)前景色
    vColorData(1) = ChrB(255)  ChrB(255)  ChrB(255) ' 藍(lán)250,綠236,紅211(淺藍(lán)色)背景色

    ' 字符的數(shù)據(jù)(可以自己修改,如果修改了尺寸,記得把前面的設(shè)定也改了)
    Dim vNumberData(9)
    vNumberData(0) = "111111111111111111110000000011111110000000000111111001111110011111100111111001111110011111100111111001111110011111100111111001111110011111100111111001111110011111100111111001111110011111100111111000000000011111110000000011111111111111111111"
    vNumberData(1) = "111111111111111111111100011111111111000001111111111000000111111111001100011111111111110001111111111111000111111111111100011111111111110001111111111111000111111111111100011111111111110001111111111000000000111111100000000011111111111111111111"
    vNumberData(2) = "111111111111111111111100000111111111100000001111111100011100111111100011110011111111111110011111111111110011111111111110011111111111110011111111111110011111111111110011110011111110011111001111111000000000111111100000000011111111111111111111"
    vNumberData(3) = "111111111111111111111000000111111111000000001111111001111110011111100111110011111111111110011111111111100011111111111110001111111111111110011111111111111100111111100111111001111110011111100111111100000000111111111000000111111111111111111111"
    vNumberData(4) = "111111111111111111111111001111111111101100111111111100110011111111110011001111111110011100111111110011110011111110000000000000111000000000000011111111110011111111111111001111111111111100111111111111110011111111111111001111111111111111111111"
    vNumberData(5) = "111111111111111111100000000001111100000000000111110011111111111111001111111111111100111111111111110011000000111111000001111001111111111111100111111111111110011111111111111001111100111111100111110011111110011111100000000011111111111111111111"
    vNumberData(6) = "111111111111111111111100000111111111100000001111111100111110011111100111111111111110011111111111111001000001111111100000000011111110001111100111111001111110011111100111111001111110011111100111111100000000111111111000000111111111111111111111"
    vNumberData(7) = "111111111111111111100000000001111110000000000111111001111110011111100111111001111111111111001111111111111100111111111111100111111111111100111111111111110011111111111111001111111111111100111111111111110011111111111111001111111111111111111111"
    vNumberData(8) = "111111111111111111111000000111111111000000001111111001111110011111100111111001111110011111100111111100000000111111110000000011111111001111001111111001111110011111100111111001111110011111100111111100000000111111111000000111111111111111111111"
    vNumberData(9) = "111111111111111111111000000111111111000000001111111001111110011111100111111001111110011111100111111100000000011111110000001001111111111111100111111111111110011111111111111001111110011111001111111100000000111111111000000111111111111111111111"

    ' 隨機(jī)產(chǎn)生字符
    Dim vCode(), vCodes
    ReDim vCode(codeLen-1)
    vCodes = GetVerifyNumber
    For i = 0 To 4
        vCode(i) = cint(mid(vCodes,i+1,1))
        vCode(i) = pcd_doubter(vNumberData(vCode(i)),UnitWidth,UnitHeight,DotsLimit,tryCount,dbtTimes)
    Next

    ' 隨機(jī)產(chǎn)生字符
    'Dim vCodes
    'ReDim vCode(codeLen-1)
    'For i = 0 To codeLen-1
    '  vCode(i) = Int(Rnd * cAmount)
    '  vCodes = vCodes  Mid(cCode, vCode(i) + 1, 1)
    '  vCode(i) = pcd_doubter(vNumberData(vCode(i)),UnitWidth,UnitHeight,DotsLimit,tryCount,dbtTimes)
    'Next

    'Session(pSN) = vCodes  '記錄入Session

    ' 輸出圖像文件頭
    Response.BinaryWrite ChrB(66)  ChrB(77)  Num2ChrB(54+ImgWidth*ImgHeight*3,4)  ChrB(0)  ChrB(0)  ChrB(0)  ChrB(0)  ChrB(54)  ChrB(0)  ChrB(0)  ChrB(0)  ChrB(40)  ChrB(0)  ChrB(0)  ChrB(0)  Num2ChrB(ImgWidth,4)  Num2ChrB(ImgHeight,4)  ChrB(1)  ChrB(0)

    ' 輸出圖像信息頭
    Response.BinaryWrite ChrB(24)  ChrB(0)  ChrB(0)  ChrB(0)  ChrB(0)  ChrB(0)  Num2ChrB(ImgWidth*ImgHeight*3,4)  ChrB(18)  ChrB(11)  ChrB(0)  ChrB(0)  ChrB(18)  ChrB(11)  ChrB(0)  ChrB(0)  ChrB(0)  ChrB(0)  ChrB(0)  ChrB(0)  ChrB(0)  ChrB(0)  ChrB(0)  ChrB(0)

    ' 生成干擾線
    ReDim noiseLine(1,-1)
    Call makeNoise(noiseLine,ImgWidth,ImgHeight)
    Call makeNoise(noiseLine,ImgWidth,ImgHeight)
    ' 如果想多畫幾條直接復(fù)制就可以
    ' Call makeNoise(noiseLine,ImgWidth,ImgHeight)

    ' 位置隨機(jī)
    ActUnitWidth = Int(ImgWidth / codeLen)
    ImgYuWidth = ImgWidth - ActUnitWidth * codeLen
    ReDim posAry(1,codeLen-1)
    posAry(0,0) = Int((Rnd)*(posX+(ActUnitWidth-UnitWidth)/2))
    posAry(1,0) = Int((ImgHeight-UnitHeight)/2+(1-2*Rnd)*posY)
    For i=1 To codeLen-2
        posAry(0,i) = Int((1-2*Rnd)*(posX+(ActUnitWidth-UnitWidth)/2))
        posAry(1,i) = Int((ImgHeight-UnitHeight)/2+(1-2*Rnd)*posY)
    Next
    If codeLen > 1 Then
        posAry(0,codeLen-1) = Int((Rnd)*(posX+(ActUnitWidth-UnitWidth)/2))
        posAry(1,codeLen-1) = Int((ImgHeight-UnitHeight)/2+(-Rnd)*posY)
    End If

    ' 輸出圖像數(shù)據(jù)
    For i = ImgHeight-1 To 0 Step -1    '行
      For ii = 0 To codeLen-1                    '字
          For iii = 0 To ActUnitWidth-1         '字寬
              flag = 0
              If onNoiseLine(noiseLine,ii*ActUnitWidth+iii,i) Then ' 干擾線
                   flag = 1
            ElseIf getUnitDot(posAry,vCode,ii,iii,i,UnitWidth,UnitHeight) = "0" Then
                flag = 1
            ElseIf getUnitDot(posAry,vCode,ii-1,iii+ActUnitWidth,i,UnitWidth,UnitHeight) = "0" Then
                flag = 1
            ElseIf getUnitDot(posAry,vCode,ii+1,iii-ActUnitWidth,i,UnitWidth,UnitHeight) = "0" Then
                flag = 1
            End If
            ' 隨機(jī)生成雜點(diǎn)
            If Rnd * 99 + 1  cOdds Then flag = 1 - flag
            Response.BinaryWrite vColorData(1-flag)
             Next
        Next
         For ii = 0 To ImgYuWidth-1
             Response.BinaryWrite vColorData(1)
         Next
    Next
End Sub

Rem 獲取單元的點(diǎn)(考慮位移)
Function getUnitDot(ByRef posAry,ByRef vCode,i,ByVal x,ByVal y,UnitWidth,UnitHeight)
    getUnitDot = "1"
    If i  0 Or i > UBound(vCode) Then Exit Function
    x = x - posAry(0,i)
    If x  0 Or x >= UnitWidth Then Exit Function
    y = y - posAry(1,i)
    If y  0 Or y >= UnitHeight Then Exit Function
    getUnitDot = Mid(vCode(i),y*UnitWidth+x+1,1)
End Function

Rem 生成干擾線
Sub makeNoise(ByRef nl,imgW,UnitHeight)
    Dim i,l,x1,y1,x2,y2,dx,dy,deltaT
    x1 = Int(Rnd*imgW)
    y1 = Int(Rnd*UnitHeight)
    x2 = Int(Rnd*imgW)
    y2 = Int(Rnd*UnitHeight)
    dx = X2 - X1
    dy = Y2 - Y1
    If Abs(dx) > Abs(dy) Then deltaT = Abs(dx) Else deltaT = Abs(dy)
    If deltaT = 0 Then Exit Sub
    l = UBound(nl,2)
    ReDim Preserve nl(1,l+deltaT+1)
    l = l + 1
    For i = 0 To deltaT
        nl(0,l+i) = x1 + dx * i \&;deltaT
        nl(1,l+i) = y1 + dy * i \&;deltaT
    Next
End Sub

Rem 判斷是否為干擾線上的點(diǎn)
Function onNoiseLine(ByRef nl,x,y)
    onNoiseLine = False
    Dim i
    For i=0 To UBound(nl,2)
        If x = nl(0,i) And y = nl(1,i) Then
            onNoiseLine = True
            Exit For
        End If
    Next
End Function

Rem 對單個字的點(diǎn)陣進(jìn)行干擾
Rem 干擾思想:在點(diǎn)陣范圍內(nèi)隨機(jī)產(chǎn)生2個端點(diǎn),進(jìn)行連線,以位移較大的一方做橫軸,先將連線上的點(diǎn)刪除,再將被刪除點(diǎn)的縱軸方向上方或下方的點(diǎn)(隨機(jī)確定)移向被刪除點(diǎn),移動后的空白用背景色補(bǔ)充
Function pcd_doubter(ByVal str,UnitWidth,UnitHeight,DotsLimit,tryCount,dbtTimes)
    Randomize
    Dim x1,x2,y1,y2,dx,dy,deltaT,i,ii,way,f1,f2
    For f1=1 To dbtTimes    '干擾次數(shù)
        For f2=1 To tryCount    '避免刪除有效點(diǎn)超過上限的嘗試次數(shù)限制
            '隨機(jī)確定2個端點(diǎn)
            x1 = int(Rnd*UnitWidth)
            x2 = int(Rnd*UnitWidth)
            y1 = int(Rnd*UnitHeight)
            y2 = int(Rnd*UnitHeight)
            dx = X2 - X1
            dy = Y2 - Y1
            If Abs(dx) > Abs(dy) Then deltaT = Abs(dx) Else deltaT = Abs(dy)
            ReDim ary(1,deltaT)    '存儲連線的點(diǎn)
            If deltaT = 0 Then
                ary(0,0) = x1
                ary(1,0) = y1
            Else
                ii = 0
                For i = 0 To deltaT
                    ary(0,i) = x1 + dx * i \&;deltaT
                    ary(1,i) = y1 + dy * i \&;deltaT
                    If pcd_getDot(ary(0,i),ary(1,i),str,UnitWidth) = "0" Then ii = ii + 1
                Next
                ' 統(tǒng)計連線上有效點(diǎn)的數(shù)量,如未超過有效點(diǎn)上限則跳出循環(huán),執(zhí)行干擾
                If ii = DotsLimit Then Exit For
            End If
        Next

        ' 執(zhí)行干擾(dx,dy改作不同的方向標(biāo)記用)
        If Abs(dx) > Abs(dy) Then dx = 1 Else dx = 0
        If dx = 1 Then
            If Int(Rnd*10) > 4 Then
                dy = 1
                way = -1
            Else
                dy = UnitHeight - 2
                way = 1
            End If
        Else
            If Int(Rnd*10) > 4 Then
                dy = 1
                way = -1
            Else
                dy = UnitWidth - 2
                way = 1
            End If
        End If
        For i=0 To deltaT
            For ii=ary(dx,i) To dy Step way
                Call pcd_setDot(ary(0,i)*dx+ii*(1-dx),ary(1,i)*(1-dx)+ii*(dx),str,pcd_getDot(ary(0,i)*dx+(ii+way)*(1-dx),ary(1,i)*(1-dx)+(ii+way)*(dx),str,UnitWidth),UnitWidth)
            Next
            '添補(bǔ)空白
            Call pcd_setDot(ary(0,i)*dx+(dy+way)*(1-dx),ary(1,i)*(1-dx)+(dy+way)*(dx),str,"1",UnitWidth)
        Next
    Next
    pcd_doubter = str
End Function

Rem 得到某點(diǎn)的字符
Function pcd_getDot(x,y,str,UnitWidth)
    pcd_getDot = Mid(str,x+1+y*UnitWidth,1)
End Function

Rem 設(shè)置某點(diǎn)的字符
Sub pcd_setDot(x,y,ByRef str,newDot,UnitWidth)
    str = Left(str,x+y*UnitWidth)  newDot  Right(str,Len(str)-x-y*UnitWidth-1)
End Sub

Rem 將數(shù)字轉(zhuǎn)為bmp需要的格式 lens是目標(biāo)字節(jié)長度
Function Num2ChrB(ByVal num,lens)
    Dim ret,i
    ret = ""
    While (num>0)
        ret = ret  ChrB(num mod 256)
        num = num \&;256
    WEnd
    For i=Lenb(ret) To lens-1
        ret = ret  chrB(0)
    Next
    Num2ChrB = ret
End Function
%>
您可能感興趣的文章:
  • z-blog SyntaxHighlighter 長代碼無法換行解決辦法(基于jquery)
  • z-blog SyntaxHighlighter 長代碼無法換行解決辦法(jquery)
  • 在Z-BLOG可用的新版ASP的GIF驗(yàn)證碼[V70404]
  • 在Z-Blog中運(yùn)行代碼[html][/html](純JS版)
  • Z-Blog中用到的js代碼
  • JS擴(kuò)展Z-Blog圖片驗(yàn)證碼的單擊自動刷新與評論內(nèi)容自動保存
  • Z-Blog常用標(biāo)簽大全(官方版)

標(biāo)簽:家電維修 麗江 鐵嶺 泰州 溫州 昆明 咸陽 昌都

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《反SPAM新思路—換Z-BLOG的驗(yàn)證碼!》,本文關(guān)鍵詞  反,SPAM,新思路,新,思路,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《反SPAM新思路—換Z-BLOG的驗(yàn)證碼!》相關(guān)的同類信息!
  • 本頁收集關(guān)于反SPAM新思路—換Z-BLOG的驗(yàn)證碼!的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章