2.2 应用层协议

两台计算机可以通过TCP在互联网上可靠地交换数据,但TCP没有规定如何解析发送的数据。为此,两台计算机都需要同意通过套件中另一个更高级别的协议交换信息。建立在TCP(或UDP)之上的协议称为应用层协议。图2-1说明了应用层协议在互联网协议套件中的位置。

025-01

图2-1 组成互联网协议套件的各层

互联网协议套件的底层协议提供了网络上的基本数据路由,而应用层的高级协议为应用程序交换数据提供了更多的结构。许多类型的应用程序使用TCP作为互联网上的传输机制。例如,使用简单邮件传输协议(SMTP)发送电子邮件,即时消息软件通常使用可扩展消息和状态协议(XMPP),文件服务器通过文件传输协议(FTP)进行上传和下载,而Web服务器使用超文本传输协议(HTTP)。因为Web是本书的重点,所以我们需要更详细地了解HTTP。

Web服务器使用HTTP将网页及其资源传输到用户代理(例如Web浏览器)。在HTTP会话中,用户代理生成对特定资源的请求。预期这些请求的Web服务器将返回包含所请求资源的响应,或者返回错误代码(如果无法满足该请求)。HTTP请求和响应都是纯文本消息,尽管它们通常以压缩和加密的形式发送。本书介绍的所有漏洞利用都以某种方式使用HTTP,因此值得详细了解组成HTTP会话的请求和响应的工作原理。

1. HTTP请求

浏览器发送的HTTP请求包含以下元素:

  • Method(方法) 也称为动词,它描述了用户代理希望服务器执行的操作。
  • Universal Resource Locator(URL,统一资源定位器) 描述了将要操作或获取的资源。
  • Header(标头) 提供元数据,例如用户代理所期望的内容类型或是否接受经过压缩的响应。
  • Body(响应正文) 此可选组件包含需要发送到服务器的所有其他数据。

代码清单2-1中显示了一个HTTP请求。

代码清单2-1 一个简单的HTTP请求

026-01

方法(这里是GET026-02和URL026-03出现在第一行。在单独的行上紧跟着HTTP标头。用户代理(User-Agent)标头026-04告诉网站发出请求的浏览器类型。Accept标头027-01告诉网站浏览器期望的内容类型。

使用GET方法的请求(简称为GET请求)是互联网上最常见的请求类型。GET请求在Web服务器上获取由特定URL标识的特定资源。对GET请求的响应将包含一个资源:可能是网页或图像,甚至是搜索请求的结果。代码清单2-1中的示例请求表示尝试加载example.com主页,是当用户在浏览器的导航栏中输入example.com时生成的。

如果浏览器需要将信息发送到服务器,而不仅仅是获取数据,则通常使用POST请求。当你在网页上填写表格并提交时,浏览器会发送POST请求。因为POST请求包含发送到服务器的信息,所以浏览器在HTTP标头之后的请求正文中发送该信息。

你将在第8章了解在向服务器发送数据时使用POST而不是GET请求的原因。错误地使用GET请求进行检索资源以外的任何操作的网站,会容易受到跨站点请求伪造(CSRF)攻击。

在开发网站时,你可能还会遇到PUTPATCHDELETE请求。它们分别用于上传、编辑或删除服务器上的资源,通常由嵌入在网页中的JavaScript触发。表2-1中列出了一些其他值得了解的方法。

表2-1 不常用的HTTP方法

027-02

一旦Web服务器接收到HTTP请求,它就会用HTTP响应回复用户代理。我们来分析一下响应的结构。

2. HTTP响应

Web服务器发回的HTTP响应以协议描述——一个三位数的状态码开始,通常还有一条状态消息指示是否可以满足请求。响应还包含提供元数据的标头,这些元数据指示浏览器如何处理内容。最后,大多数响应都包含一个正文,正文本身包含所请求的资源。代码清单2-2显示了一个简单的HTTP响应的内容。

代码清单2-2 来自example.com的HTTP响应

028-01

响应从协议描述026-02、状态码026-03和状态消息026-04开始。格式为2xx的状态码表示请求已被理解、接受并响应。格式为3xx的代码会将客户端重定向到其他URL。格式为4xx的代码表示客户端错误:浏览器生成了明显无效的请求。这种类型的最常见错误是HTTP 404 Not Found。格式为5xx的代码表示服务器错误:请求有效,但服务器无法满足该请求。

接下来是HTTP标头027-01。几乎所有的HTTP响应都包含一个Content-Type标头,该标头指示返回的数据类型。对GET请求的响应通常还包含Cache-Control标头,以指示客户端应在本地缓存大型资源(例如,图像)。

如果HTTP响应成功,则正文包含客户端尝试访问的资源——通常是描述请求的网页结构的超文本标记语言(HTML)029-01。在这种情况下,响应包含样式信息029-02以及页面内容本身029-03。其他类型的响应可能返回JavaScript代码,用于设置HTML样式的级联样式表(CSS)或正文中的二进制数据。