本发明属于软件测试,尤其涉及一种面向restful api的模糊测试方法。
背景技术:
1、随着信息技术的持续发展,互联网及软件产品日益向开放,共享的模式发展。通过应用程序接口(application programming interface,api))进行信息的开放共享已经成为互联网和软件产品发展的重要趋势。如今,多数 web 服务都是通过 rest api 以编程方式供用户访问,由于web服务承载了企业的大量信息业务,因此web服务接口的可靠性和安全性已日趋重要。接口模糊测试(fuzzzing)是web接口安全测试的主要手段之一。但在实际使用过程中,由于接口之间复杂依赖关系以及接口内部逻辑的复杂性,使得web应用程序接口fuzzing存在生成的测试用例有效性较低、用例规模过大和用例覆盖率低等问题。
2、现有技术缺陷在于:
3、1.现有restful api接口fuzzing测试中没有考虑接口之间的资源依赖和数据依赖,直接独立的测试每个接口,导致很多测试无法满足业务逻辑,因此测试效率较低;
4、2.现有方法在进行变异时,只对参数值进行变异没有对复合参数的结构进行变异,导致测试不全面;
5、3.现有方法在进行测试时,同样以代码行覆盖率作为引导评估指标,会造成两方面的不足:a.一些代码行较少的分支容易很难被探测到,导致覆盖不前面;b.只使用代码行覆盖率指标比较单一,无法探测代码不同分支结构的覆盖情况,从而无法引导测试引擎对不同目标使用不同的精细化变异策略。
技术实现思路
1、本发明的目的在于:为了克服现有技术问题,公开了一种面向restful api的模糊测试方法,本发明方法创新性引入接口依赖分析技术来解决web服务中不同api的依赖关系,同时通过设计高效的变异算法来生成高质量的变异样本,从而有效提升接口模糊测试的有效性和效率。
2、本发明目的通过下述技术方案来实现:
3、一种面向restful api的模糊测试方法,所述模糊测试方法包括如下步骤:
4、s1:对输入的web api的接口文档进行解析,得到各请求接口的请求路径、请求方式、请求参数以及请求响应信息;
5、s2:基于s1得到的各接口的请求路径和请求参数,使用语义匹配分析方法分别构建资源依赖树;
6、基于s1得到的各接口的请求参数和请求响应,使用语义匹配分析技术分别构建数据依赖树;
7、s3:基于s2得到的资源依赖树和数据依赖树,通过树深度优先遍历算法进行遍历后得到接口请求顺序;
8、s4:根据请求接口顺序,依次对每个接口生成测试用例以对相应接口进行测试;
9、在成测试用例生成过程中,
10、如果还没有初始种子,则根据每个接口的参数定义随机生成对应的参数值,然后构建初始种子;
11、如果已经存在种子,则每次以预设概率从已有种子中采样一个样本后对其他求参数进行变异后生成新的测试种子;
12、s5:基于s4生成的测试样本构造http请求发送到目标程序对其进行模糊测试;
13、s6:基于s5生成的http请求,获取其响应结果,如果响应状态码为200ok,则将该请求的请求参数或者请求参数值存储在外部资源依赖池中,供后续其他有依赖关系的接口直接使用;
14、并在目标程序中插入探针,收集测试样本执行情况,然后收集测试样本的适度值,并根据适度值对种子样本进行更新;
15、s7:重复s4对接口进行测试,直到测试预算时间已经耗尽或者所有接口的覆盖情况达到预期后结束模糊测试。
16、根据一个优选的实施方式,步骤s2中,采用如下方式构建资源依赖树:
17、首先将所有路径以/符号进行分割得到每个路径的元素,然后根据元素长度进行排序,将路径元素最少的节点作为root节点创建树;
18、而其他节点则将去除最后一个元素后得到的路径前缀和比该路径拥有更少的节点路径依次进行比较,然后能匹配成功则将该节点作为其子节点创建新的树节点;
19、如果某个路径节点与比该节点拥有更少元素的所有节点进行比较都无法匹配成功,则将该节点作为一个新根节点创建一棵新的树。
20、根据一个优选的实施方式,在创建树后,所有各节点请求方法以及各节点的请求顺序基于预设语义模板确定;并在确定好各节点请求方法以及各节点的请求顺序后,再确定每个节点请求方法的和兄弟节点以及父节点之间的参数依赖关系。
21、根据一个优选的实施方式,进行参数依赖确定时,如果参数是原生类型,采用如下方法确认:当某个请求的参数名称和某个请求的返回响应的参数的名称完全相同,则确定两者存在依赖;将两个字符串忽略大小写、去除特殊符号后,如果是相同,则两者存在依赖;使用波特词干算法来比较两个字符串的词干来确定其是否代表同一个语义的参数,若相同则两者存在依赖。
22、根据一个优选的实施方式,进行参数依赖确定时,如果参数是复合类型,采用如下方法确认:根据两个参数是否有相同的schema来确定两者是否存在依赖,如果两个参数的schema相同,则确定参数存在依赖;当某个请求的参数的schema和响应返回的参数的schema相同,则确定两者存在依赖。
23、根据一个优选的实施方式,步骤s4中,在生成种子请求参数的过程中,对于有依赖关系的参数,则直接根据依赖关系从外部资源依赖池中检索依赖值进行填充;对于非依赖测试,则采用随机初始化或者变异的方式来生成参数值。
24、根据一个优选的实施方式,步骤s6中,通过在目标程序的所有分支处插入探针,然后计算测试样本执行的路径和目标分支的分支距离,完成样本评估。
25、根据一个优选的实施方式,步骤s6中,对种子样本进行更新时采用多目标优化算法来决定是否需要将新的测试样本加入到种子队列中。
26、根据一个优选的实施方式,步骤s6中,通过将适度值和已有种子队列中其他样本值进行比较后来决定是否需要将新的测试用例加入到种子样本中。
27、前述本发明主方案及其各进一步选择方案可以自由组合以形成多个方案,均为本发明可采用并要求保护的方案。本领域技术人员在了解本发明方案后根据现有技术和公知常识可明了有多种组合,均为本发明所要保护的技术方案,在此不做穷举。
28、本发明的有益效果:
29、本发明方法首先通过分析接口之间的依赖关系(包括资源依赖和数据依赖)生成接口的请求顺序,然后在使用策略变异算法后对接口进行变异后生成测试用例对接口进行模糊测试。为了进一步提高测试的有效性,通过收集测试用例在被测程序上运行的适度值(用于评价测试用例好坏的度量指标)引导测试引擎生成更高质量的测试用例数据,以提高测试的有效性。
30、本发明方法创新性引入接口依赖分析技术来解决web服务中不同api的依赖关系,同时通过设计高效的变异算法来生成高质量的变异样本,从而有效提升fuzzing测试的有效性和效率。
1.一种面向restful api的模糊测试方法,其特征在于,所述模糊测试方法包括如下步骤:
2.如权利要求1所述的模糊测试方法,其特征在于,步骤s2中,采用如下方式构建资源依赖树:
3.如权利要求2所述的模糊测试方法,其特征在于,在创建树后,所有各节点请求方法以及各节点的请求顺序基于预设语义模板确定;
4.如权利要求3所述的模糊测试方法,其特征在于,进行参数依赖确定时,如果参数是原生类型,采用如下方法确认:
5.如权利要求3所述的模糊测试方法,其特征在于,进行参数依赖确定时,如果参数是复合类型,采用如下方法确认:
6.如权利要求1所述的模糊测试方法,其特征在于,步骤s4中,在生成种子请求参数的过程中,
7.如权利要求1所述的模糊测试方法,其特征在于,步骤s6中,通过在目标程序的所有分支处插入探针,然后计算测试样本执行的路径和目标分支的分支距离,完成样本评估。
8.如权利要求7所述的模糊测试方法,其特征在于,步骤s6中,对种子样本进行更新时采用多目标优化算法来决定是否需要将新的测试样本加入到种子队列中。
9.如权利要求8所述的模糊测试方法,其特征在于,步骤s6中,通过将适度值和已有种子队列中其他样本值进行比较后来决定是否需要将新的测试用例加入到种子样本中。
