图文验证码怎么测试及自动化测试怎么解决验证码问题?

前言

在对安全性有要求的软件(系统)中都存在验证码,那我们应该怎么进行测试呢,在自动化测试中又该怎么通过验证码使自动化顺利进行下去呢?

首先,来简单认识下验证码

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

1、验证码的由来和作用

验证码,是一种区分其用户是计算机还是人类的公共全自动程序算法。这个验证码形式的问题是由计算生成并评判,但必须只允许有意识的人才能解答。

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

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

2、验证码的存储

既然在网页中的验证码是图文验证码,以图片文字的形式显示出来,那么在网页源码可能存在于以下几种方式:

存储于文件中;

HTML语句中直接放入经过编码的验证码信息;

HTML语句中直接放入请求的验证码URL信息;
计算机生成验证码后,一般以session方式将验证码存储在服务器进程;
存储于redis等nosql数据库中,通过调用nosql的客户端驱动查询;
存储于数据库,通过进程内的接口进行查询或者直接进行数据库查询;
计算机服务器生成验证码后,就会缓存起来,原因在于方便用户提交验证码时进行验证。

3、验证码的原理

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

首先,前端网页通过一个URL来对后端进行请求;

接着,后端接收到前端的请求后,它将生成一个随机图文,然后把该随机图文存储于与对应客户端的session中;

然后,将该随机图文进行图像处理,使计算机难以识别而人类容易辨别,经过处理的图文(.png、.jpg等多种格式)直接发至前端;

最后,前端验证用户输入图文的验证答案,与后端生成的验证码是否一致,若一致则成功登录获取消息,反之不能通过。

如何测试验证码?

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

1、手动测试

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

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

2、自动化测试

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

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

1)注释验证码模块(现在很少用这种方案)

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

2)设置验证码开关(也不推荐)

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

3)设置万能验证码(当前主流做法)

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

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

4)记录Cookies信息(不太推荐,对于复杂的验证方式这种方式可以考虑)

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

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

5)验证码图文识别(作为安全性测试的一部分)

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

6)OCR图像识别(同样作为安全性测试的一部分)

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

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

7)Python-tesseract图像识别(同样可作为安全性测试的一部分)

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

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

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

在这里插入图片描述

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/101072.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis客户端通信RESP协议

ESP是Redis序列化协议,Redis客户端RESP协议与Redis服务器通信。 RESP协议在Redis 1.2中引入,但在Redis 2.0中成为与Redis服务器通信的标准方式。这个通信方式就是Redis客户端实现的协议。 RESP实际上是一个序列化协议,它支持以下数据类型&a…

提升职场竞争力,掌握高级开发面试知识!

Java后端开发技能: JVM:内存模型、类加载机制、双亲委派、垃圾回收算法、垃圾回收器、空间分配担保策略、可达性分析、强软弱虚引用、GC的过程、三色标记、跨代引用、内存泄漏与溢出多线程:集合、Synchronized、ThreadLocal、AQS、线程池JVM…

Docker私有仓库打开2375端口(linux)

前言 在我们开发测试过程中,需要频繁的更新docker镜像,然而默认情况下,docker的2375端口是关闭的,下面介绍如何打开端口。 1、打开步骤 1.1、修改配置 登录docker所在服务器,修改docker.service文件 vi /usr/lib/sys…

如何正确高效使用墨西哥专线?

在当今全球化的物流行业中,跨境运输服务已经成为许多企业拓展国际市场的重要手段。然而,由于各国法律法规、文化差异以及运输环节的复杂性,企业在进行跨境运输时可能会遇到诸多挑战。为了解决这些问题,一些专业的物流公司推出了“…

SpringBoot Redis 基础使用

redis是一个key-value。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。 Redis能做什么: 1. 缓存,毫无疑问这…

【flutter / dart 版本】Websocket获取B站直播间弹幕教程——基于B站直播开发平台

教程 B站直播开发平台弹幕获取教程01 代码 1、引入相关库 dependencies:crypto: ^3.0.3uuid: ^4.1.0dio: ^5.3.3archive: ^3.3.72、创建bili_project.dart import dart:convert; import package:bili_websocket.dart; import package:crypto/crypto.dart; import package:…

Centos中清除因程序异常终止,导致的残留的Cache/buff_drop_caches命令---linux工作笔记063

我这里因为nifi程序背压设置的不合理,导致,内存和CPU消耗过高,系统崩溃,但是重启NIFI以后,发现 对应的执行top命令,看到,系统的buff/cache 依然没有减少,说明内存被浪费了,残留在这里没有被回收. 用这个办法执行这个命令; linux会自动触发清理,但是只有在内存不够用的时候才会…

SQLite Autoincrement特性

摘要 AUTOINCREMENT会使用额外的CPU、内存和磁盘空间,如不是特别需要尽量不要使用。类型为INTEGER PRIMARY KEY的列会被作为rowid(WITHOUT ROWID表除外),并且是一个8字节有符号整数。执行INSERT操作时如果未提供rowid&#xff0c…

【AN-Animate教程——熟悉工作区】

【AN-Animate教程——熟悉工作区】 初始页面创建舞台主舞台界面其他常用板块 本篇内容:Animate用途 重点内容:熟悉工作区,以及基本操作 工 具:Adobe Animate 2022 初始页面 在初始页面当中,我们可以看到一个忍者和一个…

Mainflux IoT:Go语言轻量级开源物联网平台,支持HTTP、MQTT、WebSocket、CoAP协议

Mainflux是一个由法国的创业公司开发并维护的安全、可扩展的开源物联网平台,使用 Go语言开发、采用微服务的框架。Mainflux支持多种接入设备,包括设备、用户、APP;支持多种协议,包括HTTP、MQTT、WebSocket、CoAP,并支持…

Redis根据中心点坐标和半径筛选符合的数据

目录 1.启动Redis​编辑 2.导入maven依赖 3.添加redis配置 4.编写RedisService 5.使用 6.验证 1.启动Redis 2.导入maven依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifac…

uniapp搭建项目

使用Vue3/Vite版 创建以 javascript 开发的工程&#xff08;如命令行创建失败&#xff0c;请直接访问 gitee 下载模板&#xff09; npx degit dcloudio/uni-preset-vue#vite my-vue3-project复制代码 npx degit dcloudio/uni-preset-vue#vite-alpha my-vue3-project复制代码创…

pnpm、npm、yarn 包管理工具『优劣对比』及『环境迁移』

前言 博主在开发前端网站的时候&#xff0c;发现随着开发的项目的逐渐增多&#xff0c;安装的依赖包越来越臃肿&#xff0c;依赖包的安装速度也是非常越来越慢&#xff0c;多项目开发管理也是比较麻烦。之前我就了解过 pnpm&#xff0c;但是当时担心更换包管理环境可能会出现的…

[modern c++] 函数式编程与 std::ref

参考&#xff1a; std::ref, std::cref - cppreference.comhttps://en.cppreference.com/w/cpp/utility/functional/ref 正文&#xff1a; 如果不涉及函数式编程&#xff0c;那么基本上不需要使用到 std::ref &#xff0c; 这个功能式是用来解决函数式编程时入参只能进行值传…

openlayers图层数据覆盖

openlayers图层数据覆盖 openlayer 有两个图层A和B 图层A 覆盖 图层B 在 OpenLayers 中&#xff0c;可以通过添加不同的图层来实现图层的覆盖效果。要使图层A覆盖图层B&#xff0c;你可以按照以下步骤进行操作&#xff1a; 1 创建地图容器&#xff1a; var map new ol.Map…

【思维构造】Dominant Character—CF1605C

Dominant Character—CF1605C 思路 若字符串中存在相邻的 a 字符&#xff0c;即存在 aa 子串。输出 2 2 2。若字符串中不存在相邻的 a 字符。那么满足条件的子串的格式一定是 a xx a ... a xx a&#xff0c;其中 xx 代表由 b 和 c 组成的字符串。那么显然可以对 a 的数…

什么是广电入库

什么是广电入库 入库&#xff0c;就意味着该节目在广播电视媒体机构可随时随地被调用&#xff0c;可任意安排播出时间和播出频率。入库的节目可实现一次制作&#xff0c;无限次使用&#xff0c;大大提高节目制作效率。同时&#xff0c;入库的节目因为具有统一的标准和规范&…

使用poi-tl循环导出word报表

先看模板和导出的效果 模板 效果 根据模板循环生成表格&#xff0c;每个表格再循环填充数据&#xff0c;也就是两层循环&#xff0c;第一层循环是学生学期信息&#xff0c;第二层循环是学生的成绩数据。 第一个循环 {{?listTable}} {{/}}第二个循环 {{reportList}} 表格…

Python 何时传的是值,何时传的是引用?

在 Python 中&#xff0c;参数的传递方式可以是传值&#xff08;pass by value&#xff09;或传引用&#xff08;pass by reference&#xff09;。然而&#xff0c;实际上 Python 中的参数传递方式是通过对象的引用进行传递。简单来说&#xff0c;当传递不可变对象时&#xff0…

KWin、libdrm、DRM从上到下全过程 —— drmModeAddFBxxx(4)

接前一篇文章:KWin、libdrm、DRM从上到下全过程 —— drmModeAddFBxxx(3) 上一回讲解了drm_mode_addfb2函数中的第一步暨第一个函数drm_core_check_feature。本回继续对于drm_mode_addfb2函数往下进行解析。为了便于理解,再次贴出其代码,在drivers/gpu/drm/drm_framebuffe…