Web 应用程序中输入验证测试研究综述

2021-07-03 03:52付迪阳
现代计算机 2021年12期
关键词:测试用例源代码代码

付迪阳

(四川大学计算机学院,成都610065)

0 引言

互联网仍将以指数增长,并在我们的日常生活中变得越来越重要,但这也导致了Web 应用程序更易受到网络骗子和黑客的攻击,输入验证在控制提交给系统的用户输入中起着关键作用,它对系统的鲁棒性起着至关重要的作用。客户端输入验证功能的重要性体现在这三方面,①安全性:客户端输入验证功能的漏洞可能导致系统遭受网络攻击[1];②可靠性:客户端输入验证功能的缺陷可能导致用户无效的输入引起系统的崩溃;③性能:客户端输入验证功能的错误可能导致允许无效输入请求服务器的方式来降低客户端与服务器之间不必要的通信来降低性能。因此,在任何与用户有密集交互的软件系统中,输入验证是必不可少,同时也是一个重要而具有挑战性的问题。

在软件程序中,通常要求通过输入验证,拒绝不满足所需业务规则所规定的输入来执行系统约束,以此来保障系统的安全性和可靠性。例如,Web 应用程序注册新用户时,都需要要求用户提交合法的用户名和密码,如果用户名和密码格式不合法则不予注册直到符合系统要求为止。在很多信息系统中需要用户提交相关个人信息,例如邮箱、电话号码、身份证号码,等等,这些信息内容都是具有特定格式规范的,如果不满足约束规则就不会提交到后台服务器。正如MSDN 中安全Web 应用程序的设计指南所述[2],适当的输入验证是抵御当今应用程序攻击的最有力措施之一。然而输入验证是一个具有挑战性的问题,输入验证的设计和实现都是由应用程序开发人员进行的,他们要考虑到周全有效的方法来测试输入验证,有效防止网络攻击和提高程序系统可靠性,解决方案的主要负担落在Web 应用程序开发人员身上。

本文对近年来输入验证测试包括功能测试和安全测试的相关研究进行了综述,并分析了这些研究进展的优缺点,最后讨论了输入验证现有研究所面临的挑战和未来的发展趋势,以期望对其研究能起到一定的帮助和推动作用。

1 输入验证的定义

Web 应用程序通常采用图1 所示的三层体系结构,包括客户端(运行在用户浏览器上)、服务器端(运行在Web 服务器上)和后端数据库(将数据持久的存储在数据库服务器上)。近年来,为了提高效率和可用性,Web 应用程序开始将许多计算任务迁移到客户端。这通过减少浏览器不必要的请求Web 服务器的响应需要,使应用程序更具响应性。现在,许多Web应用程序包括客户端输入验证功能,这些功能检查用户输入,并提示用户输入无效,提高用户体验的同时也让无效输入不需要与Web 服务器进行任何交互。

图1 Web应用程序三层体系结构

输入验证这一概念最早由Hui Liu 等人提出[3],是指大多数Web 应用程序需要处理来自其外部环境提交的输入来改变其外部效果。例如,许多Web 应用程序接收用户提交的输入,以更新维护的数据库。它们强制要求从外部环境提交的任何输入必须满足所需的约束,然后才能被接受以引发外部影响;而提交的违反约束的输入将被拒绝,并且不会引发外部影响,这种强制称为输入验证。而Nuo Li[4]和Karel Frajták[5]等人则将起细化为Web 应用程序用户输入验证(WA-UIV),但在软件测试领域,他们都属于输入验证这一大的集合,是开发人员开发可靠应用程序所需解决的问题,只是又根据平台不同分为网页端的Web 应用、服务器端、移动端的Android 和iOS 等,又可以强调用户与Web 应用程序之间的交互形式具体细化。本文仅讨论Web 应用程序的用户输入验证的相关研究。

2 输入验证相关研究

当前针对输入验证的相关研究主要分为2 个方向,一个侧重对输入验证功能的测试,另一个则是侧重对输入验证安全的测试。输入验证功能测试的方法又分为两种,一种是基于规范的方法,一种是基于源代码分析的方法。而输入验证安全测试主要是通过开发Web 入侵检测系统来检测输入验证的安全漏洞。本文将重点分析基于源代码分析的功能测试,这种方式研究更为广泛,测试结果更准确,也更适用现代Web 应用程序。

2.1 基于规范的方法

Bazzichi 和Spadafora[6]最早提出输入验证测试有关的工作主要集中在自动生成测试编译器的程序,但不会生成测试用例。而Beizer[7]提出了一种语法测试方法,该方法使用来指定用户命令,该方法应用图形覆盖技术手动生成测试用例。Marick[8]还提出了一种基于非正式准则的语法测试方法。然而只涵盖了语法,语法只是输入验证的一部分。Hayes 和Offutt 提出[9]用于测试数据密集型系统的输入验证。他们提出的这两种输入验证测试是一种基于规范的方法,它自动分析用户界面规范以生成测试用例,除了生成有效的测试用例外,还会生成无效的测试用例。由于Web 应用程序中安全性的重要性,Offutt 等人提出了绕行测试[10],这种方式通过绕过客户端检查,创建无效的测试用例来测试应用程序的输入验证。这两种方式单独从规范生成测试用例,Goodenough 和Gerhart 在他们的软件测试基础论文中指出[11]基于规范的测试方法不能保证完全正确。

2.2 基于源代码的方法

Hower[12]的研究工作都集中在Web 应用程序的测试上。他们大多用于Web 应用程序的静态验证和测量,如协议一致性、压力测试、链接检查,不直接支持Web 应用程序的功能测试。之后的研究着眼于通过形式化技术测试Web 应用程序的功能需求。Ricca 和Tonella[13]提出了Web 应用程序的UML 模型,以支持Web 应用程序分析和驱动测试用例生成。这两种技术都从源代码中提取模型,并将传统的结构和数据流测试应用到Web 应用程序域。Qi 等人[14]提出了一个基于代理的Web 应用建模框架。该方法大大降低了Web 应用程序的复杂性,并在不同的功能层次上进行了数据流测试。所提出的方法与这些方法在从源代码恢复模型和使用结构测试技术方面相同,但是,它侧重于输入验证的建模和测试。

Lucca 和Fasolino[15]将网络应用测试的策略分为白盒测试、黑盒测试和灰盒测试。白盒测试基于源代码的抽象结构生成测试输入,可以基于客户端源代码或服务器端源代码生成测试输入。Liu 等人[16]分析HTML文档,为Web 应用程序创建数据流模型,并基于数据流模型生成测试输入。Benedikt 等人[17]使用模型检查器来探索Web 应用程序中用户可以遵循的Web 站点执行路径。与基于模型的方法相比,这种方法侧重于Web 应用程序的UIV 测试,不需要任何模型。Halfond和Orso[18]使用服务器端源代码的静态分析来提取输入字段,然后根据输入字段生成测试输入。这种方式由于Web 应用程序的服务器端代码可以用不同的语言编写,因此基于静态分析自动生成控制流程图的方法并不能适用所有后端代码。加上没有测试支架,无法准确确定服务器端测试的测试结果。Andrews 等人[19]提出利用字符串分析的方法对目标应用程序动态生成字符串进行静态分析,用于检查Web 应用程序中格式良好的字符串构造。字符串分析构造了一个有限状态自动机(FSM),它近似于在运行时程序位置为特定字符串变量生成的一组可能的字符串。字符串分析的一个缺点是分析结果不精确,导致格式良好检查器中的假阳性。

在2006 年,Liu 和Tan 等人[20-24]提出了一种自动验证和测试用例生成的方法,用于从程序源代码中进行输入验证。该方法可以应用于处理提交的输入以提高测试输入验证功能测试效率,但也会生成无效的测试用例,影响测试精度。之后,他们改进了他们的方法,通过分析访问的输入之间的控制和数据依赖以及对程序中的影响,将输入验证的一些不变性质用于从程序源代码中自动恢复输入验证的方法。这种改进以帮助理解和维护输入验证的性质,从而提高程序员的工作效率和工作质量。2007 年,他们又提出了利用控制流程图的变体表示-验证流图的方法来实现自动恢复输入验证模型。基于该模型制定了两个覆盖标准来测试输入验证,并用这两个标准来指导Web 应用程序中输入验证的结构测试。但这样计算复杂度高,输入验证的测试准确率也不是很高。2008 年,他们为了更准确地测试输入验证,提出了一种从代码中提取路径划分和输入条件的方法,用于测试输入验证。这种方法对他们早期工作有了重大改进,理论和方法都有了显著改进。该方法引入了一个属性,从代码中推断出有效和无效的输入条件,以及使用恢复的输入条件来帮助黑盒输入验证测试的思想。此外,还对理论中使用的定义进行了简化和改进,消除了早期方法中的冗余和低效。

2.3 Web应用攻击检测

Sayma Khan 和Amit Saxena[25]对网络应用攻击进行了研究并分析了Web 应用程序中安全威胁的类型,提出了一种改进的网络应用输入验证攻击检测方法。Mehrnoush Vaseghipanah[26]开发了三个用于检测输入验证(IV)攻击的度量,并为每个攻击分配了一个秩序,还提出了一种检测零假阳性率Web 应用程序输入验证的方法。这样在检测阶段获得更准确的信息,利用检测水平、准确性和可发现性三种有效指标来检测Web应用程序中IV 攻击的方法。Deepa 等人[27]则开发了一个入侵检测系统工具,它通过向攻击者或恶意用户提供预警来保护Web 应用程序,从而可能不会进一步利用应用程序查找漏洞,并执行ChiSquare 测试,以验证假设的输入验证攻击。M.Kishore[28]也是提出了入侵检测系统的方法,利用网络应用程序发送的氨基酸编码形式参数的成对序列比对检测模式。使用了一种高效的Hirschberg 算法,这是一种分而治之的方法来发现针对Web 应用程序的攻击。然而传统入侵检测系统依然有效率不高,误报率高,时间和空间复杂度更高的问题。

3 结语

通过对Web 应用程序输入验证测试的相关研究,我们发现仍然存在许多面临挑战的问题,下面将阐述这些问题并对未来输入验证的研究方向进行了展望。

输入验证功能测试基于规范的方法通过设计违法输入规范来构造测试用例,严重依赖于开发文档,然而绝大多数Web 应用程序是没有开发文档的,让该方法有了很大的局限性,这种方法会生成很多无效的测试用例,测试效率低下,增加了测试成本,并且不能完全自动化。现在Web 应用测试基本都是基于代码的方法,通过从程序源代码(程序切片、控制流程图及变体)自动恢复输入验证模型的方式。这种方式的复杂度高,测试精度和覆盖率会依赖代码的编写好坏,并且测试用例的结果无法准确给出具体约束类型,会使得开发人员自己去理解输入验证代码并重复测试过程。这使得开发测试周期加大,增加开发成本。基于安全测试的方法大部分都通过建立Web 应用入侵检测系统的方式,这种方式误报率高,计算复杂度高,而且效率很低。这些都是现在输入验证测试所面临的问题。

这几年,随着深度学习的快速发展,自然语言处理被大量用于处理文本数据,例如情感分析、垃圾邮件识别,等等,并且取得了很好的效果。这让自然语言处理运用在代码提供了思路。2020 年,微软亚洲研究院就通过自然语言处理的技术通过CodeBERT[29]预训练模型来实现代码搜索和代码生成文档的任务,将代码输入到模型中,并通过训练的模型运用到下游任务中。未来输入验证测试的研究方向会将自然语言处理技术运用到其中,利用先验知识将输入验证代码的约束标注识别出来,并分类,利用深度学习去学习特征。这种方式一是可以准确识别出输入验证中的漏洞,并具体报告出是欠缺什么约束导致了漏洞。帮助开发人员理解自己的程序,并且快速准确定位出错信息,减少了不必要的测试流程,提高了开发效率。二是这种方式可以嵌入到程序中,开发人员通过浏览器调试代码就能可视化的呈现输入验证报告信息。从第一时间就能解决输入验证漏洞的问题,减少了开发周期和开发成本。所以,自然语言处理技术在未来测试软件测试以及输入验证测试中将会得到大量运用。

猜你喜欢
测试用例源代码代码
基于关键点的混合式漏洞挖掘测试用例同步方法
基于TXL的源代码插桩技术研究
神秘的代码
保护好自己的“源代码”
面向多目标测试用例优先排序的蚁群算法信息素更新策略
一周机构净增(减)仓股前20名
重要股东二级市场增、减持明细
解密别克安全“源代码”
近期连续上涨7天以上的股
测试用例集的优化技术分析与改进