将动网论坛验证码修改为算术运算提问的验证码

维护曙光助学社论坛的过程中,原先为了发帖方便没有启用验证码,结果经常有恶意广告发到论坛上来,于是在注册和发帖时启用验证码,是为了抵制自动发帖机。动网论坛流行太广,其原始的验证码程序恐怕被OCR的可能性很大,我没有去网上搜,猜想应该有了。所以,为了更加安全,将验证码程序稍加改动,变成算术题了。

另外还有1个小改进,就是原程序显示3、5、7这三个数字时上面的一横经常不清楚,我把它改的比较清楚了,方法就是在紧靠那一横下面再画一横。

修改前:

修改后:(请填写这个算术题的答案)

要代码的请在博客中跟帖留下email。

 

不好意思,好长一段时间没有上网来维护,因为我没有空间可以上传文件,只能按照大家提供的邮件发了。没有收到的请再次索取。

附加说明:
给大家发的邮件附件中 Dv_GetCode.asp 替换同名文件,应用中,还需要修改其他地方:
1、bbs/images/post/DhtmlEdit1.js 文件的大约第114行:
  找到 if (document.Dvform.codestr.value.length!=4)
  改为 if (document.Dvform.codestr.value.length<1)
2、验证码旁边的提示文字。相关的地方:
  (1) /bbs/admin_login.asp 中的相关文字改为“(请输入这个算术题的答案)”
  (2)进入管理后台→风格界面模板总管理→分页面模板(page_post)  ,查找“{$codestr}”,把其旁边的验证码提示文字改为“(请填写这个算术题的答案)”,改完后请测试效果。


动网8.0我没测试过,应该没有问题。大家看看 Dv_GetCode.asp 文件,应该明白了。

修改后的Dv_GetCode.asp 文件源码:

<%
Const nMaxSaturation = 100      ' 最大色彩饱和度
Const nBlankNoisyDotOdds = 0.2  ' 空白处噪点率
Const nColorNoisyDotOdds = 0.05 ' 有色处噪点率
Const nCharCount = 5            ' 产生的字符个数
Const nPixelWidth = 20          ' 单个字符位图的宽度
Const nPixelHeight = 20         ' 单个字符位图的高度
Const nColorHue = 220           ' 显示验证码的色调(-1表示随机色调, -2表示灰度色调)
Const nAngleRandom = 0          ' 角度随机量
Const nLengthRandom = 5         ' 长度随机量(百分比)
Const cCharSet = "0123456789+-*"
                               ' 构成验证码的字符集
                               ' 如果扩充了下边的字母矢量库,则可以相应扩充这个字符集

Dim Buf(), DigtalStr
Dim Lines(), LineCount
Dim CursorX, CursorY, DirX, DirY

Randomize
Call CreatValidCode("GetCode")

Sub CDGen_Reset()
   ' 复位矢量笔和环境变量
   LineCount = 0
   CursorX = 0
   CursorY = 0
   ' 初始的光笔方向是垂直向下
   DirX = 0
   DirY = 1
End Sub

Sub CDGen_Clear()
   ' 清空位图阵列
   Dim i, j
   ReDim Buf(nPixelHeight - 1, nCharCount * nPixelWidth - 1)

   For j = 0 To nPixelHeight - 1
       For i = 0 To nCharCount * nPixelWidth - 1
           Buf(j, i) = 0
       Next
   Next
End Sub

Sub CDGen_PSet(X, Y)
   ' 在位图阵列上画点
   Buf(Y, X) = 1
End Sub

Sub CDGen_Line(X1, Y1, X2, Y2)
   ' 在位图阵列上画线
   Dim DX, DY, DeltaT, i

   DX = X2 - X1
   DY = Y2 - Y1
   If Abs(DX) > Abs(DY) Then DeltaT = Abs(DX) Else DeltaT = Abs(DY)
   For i = 0 To DeltaT
       CDGen_PSet X1 + DX * i / DeltaT, Y1 + DY * i / DeltaT
   Next
End Sub

Sub CDGen_FowardDraw(nLength)
   ' 按当前光笔方向绘制指定长度并移动光笔,正数表示从左向右/从上向下绘制,负数表示从右向左/从下向上绘制
   nLength = Sgn(nLength) * Abs(nLength) * (1 - nLengthRandom / 100 + Rnd * nLenghtRandom * 2 / 100)
   ReDim Preserve Lines(3, LineCount)
   Lines(0, LineCount) = CursorX
   Lines(1, LineCount) = CursorY
   CursorX = CursorX + DirX * nLength
   CursorY = CursorY + DirY * nLength
   Lines(2, LineCount) = CursorX
   Lines(3, LineCount) = CursorY
   LineCount = LineCount + 1
End Sub

Sub CDGen_SetDirection(nAngle)
   ' 按指定角度设定画笔方向, 正数表示相对当前方向顺时针改变方向,负数表示相对当前方向逆时针改变方向
   Dim DX, DY

   nAngle = Sgn(nAngle) * (Abs(nAngle) - nAngleRandom + Rnd * nAngleRandom * 2) / 180 * 3.1415926
   DX = DirX
   DY = DirY
   DirX = DX * Cos(nAngle) - DY * Sin(nAngle)
   DirY = DX * Sin(nAngle) + DY * Cos(nAngle)
End Sub

Sub CDGen_MoveToMiddle(nActionIndex, nPercent)
   ' 将画笔光标移动到指定动作的中间点上,nPercent为中间位置的百分比
   Dim DeltaX, DeltaY

   DeltaX = Lines(2, nActionIndex) - Lines(0, nActionIndex)
   DeltaY = Lines(3, nActionIndex) - Lines(1, nActionIndex)
   CursorX = Lines(0, nActionIndex) + Sgn(DeltaX) * Abs(DeltaX) * nPercent / 100
   CursorY = Lines(1, nActionIndex) + Sgn(DeltaY) * Abs(DeltaY) * nPercent / 100
End Sub

Sub CDGen_MoveCursor(nActionIndex)
   ' 将画笔光标移动到指定动作的起始点上
   CursorX = Lines(0, nActionIndex)
   CursorY = Lines(1, nActionIndex)
End Sub

Sub CDGen_Close(nActionIndex)
   ' 将当前光笔位置与指定动作的起始点闭合并移动光笔
   ReDim Preserve Lines(3, LineCount)
   Lines(0, LineCount) = CursorX
   Lines(1, LineCount) = CursorY
   CursorX = Lines(0, nActionIndex)
   CursorY = Lines(1, nActionIndex)
   Lines(2, LineCount) = CursorX
   Lines(3, LineCount) = CursorY
   LineCount = LineCount + 1
End Sub

Sub CDGen_CloseToMiddle(nActionIndex, nPercent)
   ' 将当前光笔位置与指定动作的中间点闭合并移动光笔,nPercent为中间位置的百分比
   Dim DeltaX, DeltaY

   ReDim Preserve Lines(3, LineCount)
   Lines(0, LineCount) = CursorX
   Lines(1, LineCount) = CursorY
   DeltaX = Lines(2, nActionIndex) - Lines(0, nActionIndex)
   DeltaY = Lines(3, nActionIndex) - Lines(1, nActionIndex)
   CursorX = Lines(0, nActionIndex) + Sgn(DeltaX) * Abs(DeltaX) * nPercent / 100
   CursorY = Lines(1, nActionIndex) + Sgn(DeltaY) * Abs(DeltaY) * nPercent / 100
   Lines(2, LineCount) = CursorX
   Lines(3, LineCount) = CursorY
   LineCount = LineCount + 1
End Sub

Sub CDGen_Flush(X0, Y0)
   ' 按照当前的画笔动作序列绘制位图点阵
   Dim MaxX, MinX, MaxY, MinY
   Dim DeltaX, DeltaY, StepX, StepY, OffsetX, OffsetY
   Dim i

   MaxX = MinX = MaxY = MinY = 0
   For i = 0 To LineCount - 1
       If MaxX < Lines(0, i) Then MaxX = Lines(0, i)
       If MaxX < Lines(2, i) Then MaxX = Lines(2, i)
       If
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 17
    评论
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值