验证码测试的解决方案

前几天一位新同事向我请教了一个问题,其问题的重点是图文验证码怎么去测试?当时由于时间关系,只是大致给他说了下测试框架,趁着闲暇时间的总结,也把解决方案分享给大家。

1 认识验证码

测试验证码,首先我们应当了解清楚验证码是什么?其存储位置在哪里?其原理是什么?做到知己知彼。

1.1 验证码的由来和作用

验证码,英文简写是“CAPTCHA”,其全称是“Completely Automated Public Turing test to tell Computers and Humans Apart”,即全自动区分计算机和人类的图灵测试,是一种区分其用户是计算机还是人类的公共全自动程序算法。最早是由卡内基梅隆大学的路易斯·冯·安和IBM的John Langford在2002年提出,这个验证码形式的问题是由计算生成并评判,但必须只允许有意识的人才能解答。

后期被广泛用于安全信息领域,以有效防范恶意的程序算法对信息系统进行暴力性的攻击破解,比如:防范密码破解、信息盗窃、钱财转移等恶意行为。

同时也发展为多种形式的验证码。常见的有手机短信验证码、Email验证码、视频验证码、手机语音验证码、拼图验证码、静态图文验证码、GIF动态图文验证码等,其验证码的内容包含数字、字母、汉字、人文数理、人与物识别等。其中图文验证码是网站验证中最常见的一种,也是我们身边人最熟悉的一种,也是本文重点介绍测试对象。

1.2 验证码的存储

既然在网页中的验证码是图文验证码,以图片文字的形式显示出来,那么在网页源码可能存在于以下几种方式:
(1)存储于文件中
(2)HTML语句中直接放入经过编码的验证码信息
(3)HTML语句中直接放入请求的验证码URL信息
(4)计算机生成验证码后,一般以session方式将验证码存储在服务器进程
(5)存储于redis等nosql数据库中,通过调用nosql的客户端驱动查询
(6)存储于数据库,通过进程内的接口进行查询或者直接进行数据库查询

计算机服务器生成验证码后,就会缓存起来,原因在于方便用户提交验证码时进行验证。

1.3 验证码的原理

当用户需要验证时,服务器端将内存中临时生成的验证码发至客户端,为了其安全性,通常在发送后的一个有效时间内(比如:1分钟)就会删除其验证码,用户在有效时间内输入验证答案。其具体过程如下:

首先,前端网页通过一个URL来对后端进行请求;接着,后端接收到前端的请求后,它将生成一个随机图文,然后把该随机图文存储于与对应客户端的session中;然后,将该随机图文进行图像处理,使计算机难以识别而人类容易辨别,经过处理的图文(.png、.jpg等多种格式)直接发至前端;最后,前端验证用户输入图文的验证答案,与后端生成的验证码是否一致,若一致则成功登录获取消息,反之不能通过。

2 如何测试验证码

测试验证码,既要测试其功能性,又要测试其安全性;手动测试和自动化测试均不可缺少,相互互补,尽可能覆盖缺陷。

2.1 手动测试

手动测试的核心,测试用例的设计。针对验证码测试的测试用例主要参考点如下:

有效时间内 无效时间间
输入图文中正确的顺序的验证码 输入图文中正确的顺序的验证码
输入图文中正确的倒序的验证码 输入图文中正确的倒序的验证码
输入已验证过的正确验证码 输入已验证过的正确验证码
输入正确验证码的部分 输入正确验证码的部分
不输入任何信息 不输入任何信息
空格输入 空格输入
空格 + 正确验证码 空格 + 正确验证码
正确验证码 + 空格 正确验证码 + 空格
输入“验证码 + 空格 + 验证码” 输入“验证码 + 空格 + 验证码”
输入特殊字符 输入特殊字符
…… ……

根据完善的测试用例一步一步执行,最大化做到细致精准。

2.2 自动化测试

自动化测试取决于产品的生命周期,考虑自动化测试工具所带来的效益。自动化测试更多的精力放在测试案例的设计、需求的分析、自动化环境框架的搭建以及自动化测试脚本的编写上。但是针对验证码的性质,随机生成的验证码不能使计算机简单的识别,这一点使自动化测试遇到了一定的困难瓶颈,通俗的说:验证码和自动化测试是对着干的。

因此,自动化工具测试到验证码时,针对不同程度安全性的要求,使用相应效率的解决方案。其解决方案包括:注释验证码、设置验证码开关、设置万能验证码、记录Cookies信息、验证码图文识别等。

2.2.1 注释验证码模块

这是在安全性要求较低的情况下的解决方案,经过项目组的沟通,在测试阶段,开发人员将验证码模块的相关代码注释掉,等上线时取消注释。当然这样给测试人员在测试阶段减小了麻烦,但是上线正式生产环境中,该验证码模块可能给系统带来一定的障碍风险。

2.2.2 设置验证码开关

经过项目组的沟通,开发人员设置一个验证码开关模块,当手动测试时,按着测试用例进行执行;当自动化测试时,关闭验证码模块。

2.2.3 设置万能验证码

这是在安全性要求相对较高的情况下的解决方案,经过项目组的沟通,开发人员设置一个万能验证码。在设置万能验证码时,应当区分测试环境与生产环境,比如:判断当前是否是测试环境(通常情况下根据读取服务器配置文件就可判断是否是测试环境)?如果是,则输入万能验证码直接通过;如果不是,则继续按着正常的验证流程去验证。

设置万能验证码的解决方案与注释验证码的解决方案相比,该方案设置的万能验证码模块的代码可以上线,几乎不会给系统带来障碍风险,同时这样,手动测试与自动化测试均很方便。

2.2.4 记录Cookies信息

通过向browser添加Cookies,这样就可以绕过介入的验证码,而在用户介入前通过add_cookie( )方法将介入信息添加到Cookies,这样一来,若再一次访问系统时将自动的介入。

但是记录Cookies还是存在不足。一方面体现在有效Cookies是有时间限制,一旦过期无效,再次访问系统时需要重新获取;另一方面体现在如果找不到输入框名,就无法向输入框内输入介入信息。

2.2.5 验证码图文识别

如果测试人员用图文识别技术解决了自动化测试动态随机验证码,那这也相当于产品的一个Bug,使其系统并不是那么具有安全性。但为了系统的完整性,针对高级别程度安全需求的系统,利用验证码图文识别技术进行测试。

2.2.5.1 OCR图像识别

当前OCR图像识别技术已经比较成熟,能够很容易地识别出简单的图文验证码。对此大多数网站都逐步提升了图文验证码的复杂度,比如:加噪、扭曲图文等操作。当然这种对抗也正是系统不断升级的原因,敌对性发展。

针对图文验证码的加噪,测试时应当对图文先降噪,再识别;针对图文验证码的扭曲,测试时应当Machine Learning、Pattern Recognition等技术算法提取图文特征,再匹配正确的图文验证码。

2.2.5.2 Python-tesseract图像识别

除了OCR图像识别技术,还可以通过Python-tesseract识别图文验证码,需要用到tesseract-ocr图像识别工具,能够读取.png、.jpg、.gif等常规格式的图片文件。

综上所述,针对验证码的测试,最佳的解决方案就是手动测试与自动化测试并行。

  • 致谢
    若对大家有用,感谢点赞或评论;若有不足或补充之处,也感谢大家评论进行指正或完善。相信这是互相进步的开始!

验证码测试的解决方案相关推荐

  1. 【自动化测试】web自动化测试验证码如何测?如何处理验证码问题?解决方案......

    目录:导读 前言 一.Python编程入门到精通 二.接口自动化项目实战 三.Web自动化项目实战 四.App自动化项目实战 五.一线大厂简历 六.测试开发DevOps体系 七.常用自动化测试工具 八 ...

  2. 用户登录·验证码测试登录

    实现用户界面进行验证码·测试登录 具体要求是: 实现一个网页中需要两次的判断,一个判断验证码是否正确,一个登录学号与密码是否正确: 代码如下: 1.LoginController的代码 1.这里的判断 ...

  3. 车联网(智能车机)测试行业解决方案

    智能车机系统行业解读 汽车智能车机核心系统由信息系统娱乐系统(IVI系统).导航系统.智能网联系统.安全系统四个子系统组成,为用户提供信息娱乐.导航定位.安全监测.数据交互.云服务等多样性服务的综合性 ...

  4. 渗透测试-暴力破解之验证码测试token防爆破绕过

    暴力破解之验证码测试token防爆破绕过 文章目录 暴力破解之验证码测试token防爆破绕过 前言 一.什么是token 二.验证码之token防爆破绕过 总结 前言 一.什么是token 客户端to ...

  5. Web 攻防之业务安全:验证码重复使用 || 前端JS代码实现的验证码 测试.

    Web 攻防之业务安全:不安全验证码 测试. 验证码安全 也可以叫<全自动区分计算机和人类的图灵测试>,是一种区分用户是计算机还是人的共全自动程序.可以防止:恶意破解密码.刷票.论坛灌水. ...

  6. python练习—用户登录界面输入验证码测试

    用户登录界面输入验证码测试--Python import random s="qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234 ...

  7. vdimgck.php不显示,织梦后台验证码不显示解决方案

    织梦后台验证码不显示解决方案 1.找到include 下面的 vdimgck.php 找到 if(function_exists("imagejpeg")) 在前面加上ob_cle ...

  8. JavaWeb项目运行期间验证码不显示解决方案

    JavaWeb项目运行期间验证码不显示解决方案 前言 解决思路 解决过程 手动设置Heap Size大小 -Djava.awt.headless=true 参考链接 前言 场景描述 线上项目部署在To ...

  9. 经常被登录的验证码卡住? 解决方案来了!

    Time will tell. 最近看到很多反馈说,经常在Web自动化过程中,被登录的验证码给卡住,不知道该如何去通过验证码的验证. 一般情况下遇到验证码我们可能都可以找开发去帮忙解决,关闭验证码,或 ...

最新文章

  1. DOS - COPY
  2. node项目发送邮件失败
  3. 安卓APP_ 其他(1) —— 程序的签名打包并在手机上运行
  4. C++ 自定义调试信息的输出
  5. 送你一个在线机器学习网站,真香!
  6. 那些用Go实现的分布式事务框架之DTM
  7. Java 10 var关键字详解和示例教程
  8. leetcode932.BeautifulArray
  9. python里怎么读取文件-python之文件读写
  10. php客户端和服务器的值传递
  11. eclipse下载安装
  12. 显卡天梯图2022年4月 最新显卡性能排行天梯图
  13. Layui实现多条件查询
  14. 服务器搬迁需要注意的几个地方
  15. github注册关于QQ邮箱验证码问题
  16. IDEA 反编译失败 提示/*compiled code*/的解决方法
  17. android开发的程序闪退,Android软件闪退
  18. 计算机c语言入门.ppt,计算机c语言入门经典
  19. 会议或期刊是否被EI
  20. 2021-2025年中国乌贝尼美克斯行业市场供需与战略研究报告

热门文章

  1. C# System.ObjectDisposedException:“无法访问已释放的对象。 ObjectDisposed_ObjectName_Name”
  2. 杂谈:python和药物研发
  3. android 健康分析,开题报告-基于Android的健康指标记录与分析软件的设计与实现.doc...
  4. 数据可视化----ECharts---柱状图(三)
  5. 饿了么UI/element Popconfirm气泡确认框 confirm事件
  6. xp系统安装教程图解
  7. 苹果笔记本电脑性能测试软件,mac电脑耐用性测试,拿五年前的苹果电脑测试性能...
  8. 02、ADS使用记录之导入各类仿真模型导入
  9. linux 抓包生成文件,Linux下使用libpcap进行网络抓包并保存到文件(函数介绍)
  10. Facebook广告营销指南!Facebook广告投放技巧与策略!新手教程