软件测试 | 什么是 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
例 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 阅读器还是别的程序,我们都可以使用任何自己中意的客户端来模拟这些请求。事实上,这本书最终可以归结为以非传统的方式(使用测试插件)来使用非传统的客户端(测试工具)或传统客户端(网页浏览器)。
评论