软件测试 | 什么是Web应用
Web应用具有各种各样的形式和规模。它们用各种语言编写,运行在各个操作系统上,以各种方式运行。每种Web应用的核心在于,它的所有功能都是使用HTTP进行通信的,而它的结果通常采用HTML格式。输入是使用GET,POST及类似方法进行通信的。下面我们将依次讨论这几点。
我们对Web应用的定义仅仅是一切使用HTTP进行通信的软件。这个定义可能听起来很宽泛,事实也确实如此。我们在这本书中像你演示的技术适用于一切基于HTTP的技术。注意,只提供静态网页的Web服务器不在我们的讨论范围之中,因为在这种情况下并不存在软件。如果你访问同一URL,会看到完全相同的输出,而并没有软件根据请求而执行。要成为Web应用,必须执行某种类型的业务逻辑(脚本、程序、宏等等),输出中必须存在某种可能的变化,必须做出一些判断,否则,我们实际上并不是在测试软件。

有几种其他类型的软件符合“Web应用”的这个描述,但我们这里只简要提及。一般性的Web服务,以及在面向服务架构(SOA)中使用这些服务的主架构,在本书中将只简要提及。它们很重要,但却是一大类应用,需要由专门的书来论述。还有一些建立在HTTP基础上的专门的企业对企业(B2B)和电子数据交换(EDI)标准,我们也不会涉及这个领域。可以这样说,这本书中的技术也是测试这些应用的根本基础,但是理解问题域(B2B、SOA、EDI)的安全测试比一般的Web安全测试要有用得多。
术语
为了便于理解,这里给出若干将会用到的术语定义。我们尽量保持与业界认可的标准一致。
服务器
监听HTTP连接的计算机系统。这种系统上通常运行着服务器软件(比如Apache或微软的IIS)来处理这些连接。
客户端
建立到服务器的连接,请求数据的计算机或软件。客户端软件最常见的是网页浏览器,但是还有大量其他软件也会发送请求。例如,Adobe的Flash播放器可以产生HTTP请求,同样还有Java应用程序,Adobe的PDF阅读器以及大多数软件。如果你曾经在运行某种程序时看到像“本软件有新版本”这样的消息,那么这通常意味着该软件将HTTP请求发送到某处的服务器以确定是否有新版本。在考虑测试,重要的是要记住,网页浏览器只不过是能够产生Web请求的众多程序中的一种。
请求
请求封装了客户端想知道的内容。请求由几个部分组成,全部定义如下:URL、参数以及头信息形式的元数据。
URL
统一资源定位符(URL)是一种特殊类型的统一资源标识符(URI)。它指出我们试图通过HTTP进行操作的内容的位置。URL由一种协议组成(出于我们的目的,我们仅考虑http和https)。协议之后紧跟着标准记号(://),将协议与地质其余部分分隔开来。接着是可选的用户ID,可选的冒号以及可选的密码,然后是要连接的服务器的名称。服务器名称之后时资源在这台服务器上的路径。资源有可选的参数。最后,可能会使用“#”字符来引用内部段落或页面主题内部的锚记。例1-1显示了一个完整的URL,它使用了所有可能存在的选项。
例1-1:使用了全部可选字段的基本URL
http://fred:wilma@www.example.com/private.sap?doc=3&part=4#footer
例1-1带有用户ID fred,其密码是传递给http://www.example.com服务器的wilma。它请求服务器提供资源/private。asp,传递了一个取值为3的doc参数和一个取值为4的part参数,接着引用了称作footer的内部锚记或段落。
参数
参数是键-值对,键和取值之间以等号(=)连接。URL中可以有许多参数,以“&”分隔。参数可以同例1-1中那样放在URL中传递,也可以放在请求主体中,稍后详述。
方法
向服务器发出的每个请求都需要采用某种方法。到目前为止,最常见的两种方式是GET和Post。当你在网页浏览器中输入URL并按Enter键,或者在你单击链接时,你都在发出GET请求。当你单击表单上的按钮,或者进行图像上传等较复杂的操作时,大部分情况下都会产生POST请求。其他的方法(例如,PROPFIND、OPTIONS、PUT、DELETE)都主要用在被称为分布式创作和版本控制(DAV)的协议中。我们较少谈到这部分内容。

HTTP基础
HTTP使用客户端/服务器结构
正如我们在术语部分明确指出的,客户端发出请求,而服务器做出响应,不存在任何其他方式。服务器不可能做出“那边的计算机需要一些数据,我来连接它并向它发送数据”这样的决定。任何时候,如果你发现软件行为看似是服务器突然向你显示一些信息(而你并没有单击它或者明确地发出请求),这通常是应用开发人员的一点小把戏。网页浏览器和Flash Applet这样的客户端可以进行编程来轮询服务器,不时地或在特定时间发出定期请求。对测试人员而言,这意味着你可以将测试重点几种在系统的客户端 —— 仿效客户端的行为并对服务器的响应进行评估。
HTTP是无状态的
HTTP协议本身不包含任何“状态”的概念。换句话说,一个连接与任何其他连接之间不存在任何关系。假设微盘现在单击一个链接,10min之后(甚至是1s之后)我单击了另一个链接,服务器完全不知道是同一个人发出了这两个请求。应用费很大劲才能确定谁在做什么。重要的是,你要知道,是应用本身在管理会话并确定连接之间的关联。HTTP并不能确定这种关联。
那么我的IP地址呢?难道IP地址不能唯一地标记我并使服务器断定来自我的IP地址的所有连接都必须关联起来吗?答案是绝对不行。考虑许多拥有数台计算机、但是有一条Internet连接(比如宽带连接或DSL)的家庭,这种连接只能获取一个IP地址,而该网络上的某台设备(某种类型的路由器)使用称作网络地址转换(NAT)的技术来隐藏有多少台计算机在使用相同IP地址这一信息。
那么Cookie呢?它们会跟踪会话和状态吗?是的,大多数情况下会跟踪。事实上,由于Cookie如此频繁地被用于跟踪会话和状态信息,所以它们成为许多测试的焦点。正如你讲在第11章中看到的,没呢正确地跟踪会话和状态是许多安全问题的根本起因。
HTTP使用简单文本
我们可以查看通过电缆(或无线)传送的真实消息并全面了解正在发生的事情。HTTP很容易捕获,而且它非常易于被人解释和理解。更重要的是,因为它如此简单,所以HTTP请求非常容易伪造。不管该应用是网页浏览器、Flash播放器、PDF阅读器还是别的程序,我们都可以使用任何自己中意的客户端来模拟这些请求。事实上,这本书最终可以归结为以非传统的方式(使用测试插件)来使用非传统的客户端(测试工具)或传统客户端(网页浏览器)。