记一次软件测试对登陆或者注册时碰到验证码的问题

之前在做一个电商网站的自动化测试时,注册登陆时都会碰到验证码!!! 是不是特别难受。


一般有一下几种方法:

1.很没技术的,设置等待时间,手动输入。
2.暴力点的, 去掉验证码(不过只在测试环境下适用,而且你得有网站的本地文件夹)
3.设置一个万能密码(通常字生产环境上采用,能力强的一般自己改,实在不行找开发吧。很简单的这个我今天会重点分析一下)
4.比较高大尚点,人工智能识别验证码,技术要求过高,而且识别率太不见得有多高, 我之前看了几篇博客,也试着写了,通过python-tesseract但是这个有时候验证码颜色太深太浅就无法识别,外加本身技术不够。。所以等有空,再把这个补上。


今天我就先说下怎么设置万能验证码吧。
首先有几点大家应该至少要清楚的,网站是分前端,后端的, 网站前端是html语言,后端一般是用php语言。虽然说近几年php一路下跌(php是最好的语言!)
通常网站都是这样,当然也有用各种语言写成的。

前端:就是浏览器上,人能肉眼直观看到的样子。网站前端就是指的网站的静态页面设计,网站前端工作使用的是html、css、js等技术设计网站页面的样式和排版布局,这就是网站前端。

后端:就是要实现用户的注册登录验证、或者购物结算等,这些都是要代码逻辑来实现的。常见的网站后端开发语言有asp、asp.net、jsp、php等。同时网站后台技术还包括数据库如MySQL、sqlserver等,数据库是用来存储后台数据的。


先上一段php脚本让大家看看,一般网站验证码是如何实现的。

 //用户注册
    function reg_act()
    {
    	$email      = IFilter::act(IReq::get('email','post'));
    	$username   = IFilter::act(IReq::get('username','post'));
    	$password   = IFilter::act(IReq::get('password','post'));
    	$repassword = IFilter::act(IReq::get('repassword','post'));
    	$captcha    = IReq::get('captcha','post');
    	$message    = '';

		/*注册信息校验*/
    	if(IValidate::email($email) == false)
    	{
    		$message = '邮箱格式不正确';
    	}
    	else if(!Util::is_username($username))
    	{
    		$message = '用户名必须是由2-20个字符,可以为字数,数字下划线和中文';
    	}
    	else if(!preg_match('|\S{6,32}|',$password))
    	{
    		$message = '密码必须是字母,数字,下划线组成的6-32个字符';
    	}
    	else if($password != $repassword)
    	{
    		$message = '2次密码输入不一致';
    	}
    	else if($captcha != ISafe::get('Captcha'))
    	{
    		$message = '验证码不正确,请重新输入';
    	}
    	else
    	{
    		$userObj = new IModel('user');
    		$where   = 'email = "'.$email.'" or username = "'.$email.'" or username = "'.$username.'"';
    		$userRow = $userObj->getObj($where);

    		if(!empty($userRow))
    		{
    			if($email == $userRow['email'])
    			{
    				$message = '此邮箱已经被注册过,请重新更换';
    			}
    			else
    			{
    				$message = "此用户名已经被注册过,请重新更换";
    			}
    		}
    	}

		//校验通过
    	if($message == '')
    	{
    		//user表
    		$userArray = array(
    			'username' => $username,
    			'password' => md5($password),
    			'email'    => $email,
    		);
    		$userObj->setData($userArray);
    		$user_id = $userObj->add();

    		if($user_id)
    		{
				//member表
	    		$memberArray = array(
	    			'user_id' => $user_id,
	    			'time'    => ITime::getDateTime(),
	    		);
	    		$memberObj = new IModel('member');
	    		$memberObj->setData($memberArray);
	    		$memberObj->add();

	    		//用户私密数据
	    		ISafe::set('username',$username);
	    		ISafe::set('user_id',$user_id);
	    		ISafe::set('user_pwd',$userArray['password']);

				//自定义跳转页面
				$callback = IReq::get('callback') ? urlencode(IReq::get('callback')) : '';
				$this->redirect('/simple/success_info?callback='.$callback);
    		}
    		else
    		{
    			$message = '注册失败';
    		}
    	}

通过上面这段验证码,代码逻辑很简单,就是判断你post的验证码是否等于生成的验证码(相等就执行正确,不等就报错)
在这里插入图片描述
这个captcha参数也就是用来校验验证码的。它本身的意思是全自动区分计算机和人类的图灵测试,一种算法。
我们这里比较简单的方法就将它注释掉,或者删掉。但是这就是第二种方法了,删除了验证功能显然不是我们想看到的。
那么我们就判断它如何进行过滤执行的。

在这里插入图片描述
如上面的那个图,它是判断message参数的值,如果为空,即可注册成功,此时后台数据库就会增加一条改会员的基础信息
那么我们应该怎么来改呢。 其实很简单



网站采用的post方式,从而得到我们输入的值,并与随机生成的验证码匹配。若captcha验证成,则message为空,反之, 提醒验证码不正确。
大致代码审计完成,现在就该我们解决这个了问题了。代码如下:

//用户注册
    function reg_act()
    {
    	$email      = IFilter::act(IReq::get('email','post'));
    	$username   = IFilter::act(IReq::get('username','post'));
    	$password   = IFilter::act(IReq::get('password','post'));
    	$repassword = IFilter::act(IReq::get('repassword','post'));
    	$captcha    = IReq::get('captcha','post');
    	$message    = '';
	    $captcha_1  = '11111';
		/*注册信息校验*/
    	if(IValidate::email($email) == false)
    	{
    		$message = '邮箱格式不正确';
    	}
    	else if(!Util::is_username($username))
    	{
    		$message = '用户名必须是由2-20个字符,可以为字数,数字下划线和中文';
    	}
    	else if(!preg_match('|\S{6,32}|',$password))
    	{
    		$message = '密码必须是字母,数字,下划线组成的6-32个字符';
    	}
    	else if($password != $repassword)
    	{
    		$message = '2次密码输入不一致';
    	}
    	else if($captcha != ISafe::get('Captcha'))
    	{
    		
		if($captcha == $captcha_1)
		{
			$message = '';
		}
		else
		{
			$message = '验证码不正确,请重新输入';
		}		
    	}
    	**....截取....**

跟着 我们对它的验证码加上个内层if语言,再给设置一个万能密码,取名赋值。
弄完之后,一定根据情况,排查下这段代码下面的代码,是否影响后端数据库存取问题。需要留意

另外有一点,比较常见的就是, 改完之后会发现图片碎裂,无法查看。
有一个很简单的方法,在验证函数之前加上 ob_clean(); 就可以了

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值