51Testing软件测试论坛

标题: 随机验证码问题 [打印本页]

作者: 淡茶飘香    时间: 2008-1-18 16:50
标题: 随机验证码问题
我刚刚接触qtp ,想问问关于随机验证码的问题,按照图片解析的方法,如下
With Browser("Exchange Management System").Page("Exchange Management System")

Dim a,b,c,d,num
‘qX是每一个位图检查点,q1--q10第一位,q11--q20第二位,q21--q30第三位,q31--q40第四位
q1=.Image("imgcode").Check(CheckPoint("imgcode"))
q2=.Image("imgcode").Check(CheckPoint("imgcode_2"))
q3=.Image("imgcode").Check(CheckPoint("imgcode_4"))
q4=.Image("imgcode").Check(CheckPoint("imgcode_5"))
q5=.Image("imgcode").Check(CheckPoint("imgcode_6"))
q6=.Image("imgcode").Check(CheckPoint("imgcode_8"))
q7=.Image("imgcode").Check(CheckPoint("imgcode_9"))
q8=.Image("imgcode").Check(CheckPoint("imgcode_10"))
q9=.Image("imgcode").Check(CheckPoint("imgcode_11"))
q10=.Image("imgcode").Check(CheckPoint("imgcode_12"))
q11=.Image("imgcode").Check(CheckPoint("imgcode_13"))
q12=.Image("imgcode").Check(CheckPoint("imgcode_14"))
q13=.Image("imgcode").Check(CheckPoint("imgcode_15"))
q14=.Image("imgcode").Check(CheckPoint("imgcode_16"))
q15=.Image("imgcode").Check(CheckPoint("imgcode_17"))
q16=.Image("imgcode").Check(CheckPoint("imgcode_18"))
q17=.Image("imgcode").Check(CheckPoint("imgcode_19"))
q18=.Image("imgcode").Check(CheckPoint("imgcode_20"))
q19=.Image("imgcode").Check(CheckPoint("imgcode_21"))
q20=.Image("imgcode").Check(CheckPoint("imgcode_24"))
q21=.Image("imgcode").Check(CheckPoint("imgcode_25"))
q22=.Image("imgcode").Check(CheckPoint("imgcode_26"))
q23=.Image("imgcode").Check(CheckPoint("imgcode_27"))
q24=.Image("imgcode").Check(CheckPoint("imgcode_28"))
q25=.Image("imgcode").Check(CheckPoint("imgcode_29"))
q26=.Image("imgcode").Check(CheckPoint("imgcode_30"))
q27=.Image("imgcode").Check(CheckPoint("imgcode_32"))
q28=.Image("imgcode").Check(CheckPoint("imgcode_33"))
q29=.Image("imgcode").Check(CheckPoint("imgcode_34"))
q30=.Image("imgcode").Check(CheckPoint("imgcode_35"))
q31=.Image("imgcode").Check(CheckPoint("imgcode_36"))
q32=.Image("imgcode").Check(CheckPoint("imgcode_37"))
q33=.Image("imgcode").Check(CheckPoint("imgcode_38"))
q34=.Image("imgcode").Check(CheckPoint("imgcode_39"))
q35=.Image("imgcode").Check(CheckPoint("imgcode_40"))
q36=.Image("imgcode").Check(CheckPoint("imgcode_41"))
q37=.Image("imgcode").Check(CheckPoint("imgcode_42"))
q38=.Image("imgcode").Check(CheckPoint("imgcode_43"))
q39=.Image("imgcode").Check(CheckPoint("imgcode_44"))
q40=.Image("imgcode").Check(CheckPoint("imgcode_45"))
'one check 得出第一位验证码
        If ( q1 = true )  Then
          a=8
          elseif(q2=  true) then
          a=9
          elseif(q3=  true) then
          a=7
          elseif(q4=  true) then
          a=4
          elseif  ( q5 = true ) then
          a=0
          elseif(q6=  true) then
          a=3
          elseif(q7=  true) then
          a=6
          elseif(q8=  true) then
          a=1
          elseif(q9=  true) then
          a=5
          elseif(q10=  true) then
          a=2
End If
'two check 得出第二位验证码
If  (q11=  true)  Then
          b=2
          elseif(q12=  true) then
          b=3
          elseif(q13=  true) then
          b=4
          elseif(q14=  true) then
          b=9
          elseif(q15=  true) then
          b=5
          elseif(q16=  true) then
          b=6
          elseif(q17=  true) then
          b=0
          elseif(q18=  true) then
          b=8
          elseif(q19=  true) then
          b=1
          elseif(q20=  true) then
          b=7
End If

'three check 得出第三位验证码
If ( q21 = true )  Then
          c=0
          elseif(q22=  true) then
          c=7
          elseif(q23=  true) then
          c=4
          elseif(q24=  true) then
          c=8
          elseif(q25=  true) then
          c=1
          elseif(q26=  true) then
          c=6
          elseif(q27=  true) then
          c=2
          elseif(q28=  true) then
          c=9
          elseif(q29=  true) then
          c=3
          elseif(q30=  true) then
          c=5
End If


'four check 得出第四位验证码
If  (q31=  true)  Then
          d=4
          elseif(q32=  true) then
          d=0
          elseif(q33=  true) then
          d=5
          elseif(q34=  true) then
          d=1
          elseif(q35=  true) then
          d=2
          elseif(q36=  true) then
          d=3
          elseif(q37=  true) then
          d=6
          elseif(q38=  true) then
          d=9
          elseif(q39=  true) then
          d=7
          elseif(q40=  true) then
          d=8
End If

num=(cstr(a)+cstr(b)+cstr(c)+cstr(d))
msgbox" 验证码是:"&num
        .WebEdit("imgcode").Set ""&num
        .WebButton("登 录").Click
        .Sync
End With
执行后总是提示:
提示The "imgcode" Image object was not found in the Object Repository.
Check the Object Repository to confirm that the object exists or to find the correct name for the object.
Line (7): "q1=.Image("imgcode").Check(CheckPoint("imgcode"))".

请问是什么问题,怎么解决
作者: 板砖    时间: 2008-1-18 18:20
这个是用来蒙人的.
作者: by1945    时间: 2008-1-22 17:23
imgcode是你要检查的图片
作者: 暗涧幽火    时间: 2008-1-23 11:42
验证码到底怎么样才能解决呢?需要高人指点啊!
作者: mythxhg    时间: 2008-1-23 11:59
要屏蔽掉的,这么简单搞定的话就不叫验证码了,这些安全机制如果你想搞定那得象黑客那样用很多复杂的技术.

不过验证码可以分为2种,一种是客户端按指定规则生成验证码并向服务器请求图片,一种是由服务器和客户端的交互过程中随机出验证码的.

第一种情况比较简单,直接读客户端cookie或替换掉其中的验证码.但是现在很少用这种方法去实现验证码的了.

第二种情况比较复杂,而且是现在最常用到的验证码技术,要突破的话反而得不尝失,还是屏蔽掉好了.

[ 本帖最后由 mythxhg 于 2008-1-23 12:02 编辑 ]
作者: 板砖    时间: 2008-1-23 12:58
原帖由 mythxhg 于 2008-1-23 11:59 发表
要屏蔽掉的,这么简单搞定的话就不叫验证码了,这些安全机制如果你想搞定那得象黑客那样用很多复杂的技术.

不过验证码可以分为2种,一种是客户端按指定规则生成验证码并向服务器请求图片,一种是由服务器和客户端的交 ...



无语!
作者: mythxhg    时间: 2008-1-23 13:18
标题: 回复 6# 的帖子
我只是引用,全文如下:
验证码的问题,其实是现在很多测试人员面对的一个问题,如何实现自动化测试解决的一个难题,首先我们要看验证码的实现原理,才好找到自动化的方法,还有这种方法的投入是否值得!

验证码验证码的目的是为了防止暴力破解,提高网站的安全性.验证码的实现!这里看看两种实现验证码的思路!
一种,客户端生成验证码
首次代码生成随机数(验证码),并以相应Cookies值返回给客户端;
客户端请求验证码图片时,服务器端从客户端Cookies中读取验证码,据此生成输出验证码图片;
客户端输入验证码并发送回服务器,服务器端从验证码文本框中读取验证码,并与从客户端Cookies读取的验证码进行比较。

另一种实现:

根据内置变量生成不同的随机数验证码图片并输出,验证码则保存在该会话的Session全局变量中。
验证:服务器端根据该会话所返回的客户端输入验证码与Session全局变量中保存的验证码比较

这两种方法有不同的实现方式,如果是第一种方法,我们利用自动化脚本直接读取客户端cookie或者把其中的验证码替换掉,就可以达到我们自动输入的目的

对于第二种就比较复杂,我们没办法获得session的代码,怎么办呢!因为现在实现的验证码很多都是通过随机数产生,然后输出到图片中,它是动态生成的!
但是这也分为很多情况,现在很多验证码都不太复杂,有些是固定颜色、范围、字体、字号,字距的,简直就是没意义,只要划分了区域,二进制化,和标准字体一比较就出来了。有些程序的验证码只要能知道它的生成方法,就可以通过截取内存数据来获得。比如网页什么的,基本是通用的,只是显示出来的形式不同,但是各种游戏的登陆验证码,可能是各自特殊的产生方法,不通用的,要研究游戏特性太麻烦。
现在期望能做到只捕捉屏幕的当前显示图像,就识别验证码。标准几种字体又横向分散开的,基本能搞定,但是遇到字歪斜很厉害,甚至同一列位置有2字符跨过,或者联体字,暂时还没想到什么有效的方案。

可以利用OCR原理来实现识别验证码!现在来说对于输入验证码的自动测试还是比较复杂的1
需要具体问题具体分析!







如何解决WEB性能测试中的验证码问题
现在越来越多的网站为了安全性或是防止Spam的侵害,采用了验证码的校验技术。简单地说,验证码就是在进行登录或是内容提交的时候,页面上会随机出现一个人工可识别,但机器不可识别的验证字符串(一般是采用背景、扭曲等方式产生的图片),要求登录或是提交内容时同时输入这个验证码。 验证码可以有效防止对口令的刺探和所谓的网络推广软件带来的大量的Spam内容,目前已经被许多Internet或是Intranet应用接受为标准的实现方式。但对性能测试来说,这种验证码又带来了很大的问题。 最突出的问题是,性能测试工具本身是自动化工具,由于这种验证码采用的是“防止自动化工具尝试”的方法,因此,在录制了脚本之后会发现,很难对脚本进行调整,以使其适应验证码验证的需要。已经不止一次有人提到这个问题,并询问有没有较好的解决方案。 对这个问题,我个人的看法是,基本上可以考虑从三个途径来解决该问题: 1、第一种方法,也是最容易想到的,在被测系统中暂时屏蔽验证功能,也就是说,临时修改应用,无论用户输入的是什么验证码,都认为是正确的。这种方法最容易实现,对测试结果也不会有太大的影响(当然,这种方式去掉了“验证验证码”这个环节,不过这个环节本来就很难成为系统性能瓶颈)。但这种方法有一个致命的问题:如果被测系统是一个实际已上线的系统,屏蔽验证功能会对已经在运行的业务造成非常大的安全性的风险,因此,对于已上线的系统来说,用这种方式就不合适了; 2、第二种方法,在第一种方法的基础上稍微进行一些改进。第一种方法带来了很大的安全性问题,那么我们可以考虑,不取消验证,但在其中留一个后门,我们设定一个所谓的“万能验证码”,只要用户输入这个“万能验证码”,我们就验证通过,否则,还是按照原先的验证方式进行验证。这种方式仍然存在安全性的问题,但由于我们可以通过管理手段将“万能验证码”控制在一个小的范围内,而且只在性能测试期间保留这个小小的后门,相对第一种方法来说,在安全性方面已经有较大的改进了; 3、如果安全性对应用来说真的是至关重要的,不容许有一丝一毫的闪失,那我们还可以用更进一步的方法来处理这个问题。一般的性能测试工具(MI的LR、Seague的Silk performer等)都能够调用外部的DLL或是组件接口,因此,可以考虑获得“验证码验证”部分的实现,写一个验证码获取的DLL,在测试脚本中进行调用即可。 除了这三种方法以外,可能还会有其他的方法存在,也希望各位能提供一些其他的思路。在我的实践中,第二种方法用得比较多,对未上线系统系统的内部性能测试,有时候也用第一种方法。但要提醒的是,如果针对的是已上线系统,无论用哪种方法,测试完成后,都必须立刻将应用恢复,并对系统进行一次安全审计,以免在测试期间被他人入侵。第三种方法用得比较少,而且具体上还依赖于验证组件是否能提供这样的接口。
作者: 淡茶飘香    时间: 2008-1-23 16:09
谢谢大家的回复,可是还是不知道如何解决
作者: leonard_x1    时间: 2008-1-28 10:32
看了楼上几位的讲解,总结一下,验证码的测试,首先要看验证码生成的机制,针对不同的机制有不同的使用自动化工具的测试方法。有的是在系统中直接找到内部的验证码,有的方法是通过软件进行验证码图片的识别,还有就是在测试的时候屏蔽到验证码这个功能。总之是要做到具体问题具体分析。




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2