1.sql注入
我们在login.php中是模拟的查询数据库,真正的查询过程,很可能是由一下sql语句完成的:
select * from user where username='zhq' and pwd='123456' |
但是由于,我们的‘zhq’,‘123456’是由参数传递过来的一个变量,一些调皮的人就可以通过这两个参数做文章了,比如估计把zhq传递成zhq'--,那么到了程序里面执行sql就变成了:
select * from user where username='zhq'-- ‘ and pwd='123456' |
那么只要是这个用户名存在,就会返回数据!!!
对付这种漏洞,开发同学是有办法的,比如使用功能完毕的框架,开启相应的模块等等,这里不多做说明了。
2.并发
我们先开发一个购物的接口,这个接口实现的功能是,每调用一次,商品的库存就会减少1个单位
我们使用一个data.txt文件代替数据库,里面只防止一个数字,比如1000,然后编写一个文件buy.php代码如下:
<?php // 告诉浏览器返回为json类型 header('Content-Type:application/json; charset=utf-8'); $filename = "./data.txt"; $handle = fopen($filename, "r"); //通过filesize获得文件大小,将整个文件一下子读到一个字符串中 $contents = fread($handle, filesize ($filename)); fclose($handle); $handle = fopen($filename, "w"); $contents = $contents -1; fwrite($handle,$contents); fclose($handle); // 组织的数据 $data = array( 'code' => 200, 'msg' => '购买成功', 'result' => array( 'num' => $contents ) ); // PHP数组转json $rst = json_encode($data,JSON_UNESCAPED_UNICODE); // 打印结果 echo $rst; |
以上代码,就是读取data.txt中的数字,做-1操作,我们正常调用结果如下:
{"code":200,"msg":"购买成功","result":{"num":999}} |
但是如果这个时候,突然有10台电脑,在一刹那间同时访问,这个结果如何呢,data.txt中数字还会是990吗?下面我们来模拟这个操作:
把data.txt中的文字修改回1000
下载并且启动jmeter软件(百度一下如何安装和配置)
在测试计划中创建一个线程组,设置10个线程,5秒钟启动:
在线程中添加一个http请求
给线程组添加一个同步定时器,设置超时时间是10000毫秒:
给线程组添加一个一个查看结果树的监听器:
完成以上操作之后,我们将鼠标选中查看结果树,然后点击工具栏运行按钮,查看最后一个请求返回的结果:
我们可以看到,最后返回的库存数字竟然是993(这个数字有可能会变化),很明显库存并没有按照我们的预期减少10个单位,变成990!!!!
我们来强行解释一波这个错误是怎样发生的:
当一个用户来购买商品的时候,老板还没有做减库存处理(-1的操作),来了第二个人,加塞进来,这个时候老板告诉他的自然是没有更新过的库存!
当然开发同学会有解决办法,比如让购物的顾客拍个队,顺序执行。
以上就是本篇的两个方面,在实际测试过程中,测试的频率要明显低于功能,但却很重要,当然开发同学也更会用心去做,所以出现错误的机会是很少的。
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理。