{
od[j] = t[j*4+i];
}
lr_output_message("%d", getDigital(od));
}
其他通过服务器代码绘图方式实现的识别码识别相对麻烦一些,但原理上都差不多,无非是将获取到的图片进行分析,通过识别方法判断其对应的符号。
<!--[if !supportLists]-->1.2 <!--[endif]-->服务端插入法
如果可以控制和修改服务端代码,就可以使用服务端插入法。该方法在服务端提供一个可被客户端使用的接口,只要客户端传递过来自己的SessionID,该接口就返回此时正确的Session,这种方法就可以很容易地让自动测试工具直接获取到正确的应该提交的验证码内容。从测试的角度来说,这种方法就等于是在系统上增加了一个测试接口,从而提高了系统的可测试性。
服务端插入法的实现并不复杂,在任何一个平台上都能很容易实现,在此就不再赘述了。服务端插入法可以针对任何类型的应用使用,但这种方法也有明显的不足:
<!--[if !supportLists]-->1、 <!--[endif]-->如果是已经上线的应用,网站不太可能会允许保留一个这样的接口,因此,该方法一般用于还未上线的WEB系统,如果要在已上线的WEB系统上使用该方法,则必须通过管理上的方法提高该方面的安全性;
<!--[if !supportLists]-->2、 <!--[endif]-->采用这种方法,在性能测试时,由于该方法需要额外请求一次才能获得实际的验证码,相对于实际的用户操作来说,访问带有验证码页面的请求会多一次,因此在获得的测试结果上会有些许的差异。
<!--[if !supportLists]-->1.3 <!--[endif]-->解决自动测试中验证码问题的非技术方法
其实,测试并不只是单单的技术问题,除了上面给出的识别法和服务端插入法,其实,通过非技术的方式也能让自动化测试在具有验证码的系统上成功应用。当然,这些非技术方法应用的前提是,测试团队必须具有足够的能力和机会影响系统的实现。如果完全没有方法接触到服务端代码或是完全不能修改服务端代码,以下的方法就都不能应用了。
下面,让我们跳出技术的范围,换个角度来看看如何解决验证码的问题:
<!--[if !supportLists]-->1、 <!--[endif]-->屏蔽法
屏蔽法是最容易想到的一种方法,方法的核心就是:在被测系统中暂时屏蔽验证功能。这种方法最容易实现,对测试结果也不会有太大的影响(当然,这种方式去掉了“验证验证码”这个环节,如果该环节本身存在功能上的问题,或是本身就是性能的瓶颈,那就一定会对测试结果造成影响了)。但这种方法也有一个问题:如果被测系统是一个实际已上线的系统,屏蔽验证功能会对已经在运行的业务造成非常大的安全性的风险,因此,对于已上线的系统来说,用这种方式就不合适了。
<!--[if !supportLists]-->2、 <!--[endif]-->后门法
后门法不屏蔽验证码,但在其中留一个后门,在代码中设定一个所谓的“万能验证码”,只要用户输入这个“万能验证码”,就能通过验证,否则,还是按照正常的验证方式进行验证。这种方式仍然存在安全性的问题,但由于我们可以通过管理手段将“万能验证码”控制在一个小的范围内,而且只在测试期间保留这个小小的后门,相对第一种方法来说,在安全性方面有了较大的提高。
<!--[if !supportLists]-->1.4 <!--[endif]-->各种方法的比较
本文提供了多种用于解决具有验证码的WEB系统在自动测试时遇到问题的方法,这些方法既包含技术性的方法,也包含非技术性的方法。但由于每种方法的出发点不同,因此这些方法也就具有各自不同的优缺点和适用场合。本节我们对本文提到的各种方法进行比较,分别给出其优缺点和适用的场合。
|
技术性方法 |
非技术性方法 |
||
|
识别法 |
服务端插入法 |
屏蔽法 |
后门法 |
优点
|
不需要修改代码,也不需要在代码中增加额外的接口和后门,在服务端代码不可接触到的情况下,是唯一的选择 |
理论上来说可以解决任何验证码的问题,而且不需要修改已有的服务端代码 |
简单修改现有代码就能让自动测试顺利进行,开销小 |
实现方式不复杂,对现有代码改动小,安全性相对有保证 |
缺点
|
存在技术限制,只能对相对简单的验证码图片进行分析识别,对复杂的图片无法进行识别 |
存在一定的安全隐患,如果被攻击者获知测试接口,验证码就会失去作用 |
存在很大的安全问题,对于未上线应用还可应用,对于已上线的实际应用,该方法不可行;况且,由于该方法需要对代码修改的内容太多,导致发布时可能发生某些验证码被不正确屏蔽的情况 |
如果被攻击者探测得到万能验证码,则验证码会失去作用 |
适用场合
|
<!--[if !supportLists]-->1、 <!--[endif]-->服务端代码不可接触到或是不可进行任何修改 <!--[if !supportLists]-->2、 <!--[endif]-->验证码采用xbm等较简单的方式实现 |
未上线系统,或是在测试条件下安全性要求不是特别高的系统; |
开发阶段,未实际上线的系统 |
可在实际应用系统上应用 |
应用建议
|
纯粹的客户端识别解决方案成本较高,建议主要采用服务端方式实现 |
在管理上需要增加对测试接口的管理,系统在发布时需要保证去掉测试接口 |
在发布管理时,一定要有合理的方案保证发布时所有被屏蔽的验证码能够得到恢复 |
为了保证上线系统的安全,该方法一般需要结合密码管理方法使用,通过定期更换万能验证码、控制其知晓范围等手段保证安全 |