- 开发者的Web安全戒律:真实威胁与防御实践
- (美)马尔科姆·麦克唐纳
- 1654字
- 2023-07-14 20:32:34
2.2 应用层协议
两台计算机可以通过TCP在互联网上可靠地交换数据,但TCP没有规定如何解析发送的数据。为此,两台计算机都需要同意通过套件中另一个更高级别的协议交换信息。建立在TCP(或UDP)之上的协议称为应用层协议。图2-1说明了应用层协议在互联网协议套件中的位置。
图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请求
方法(这里是GET
)和URL出现在第一行。在单独的行上紧跟着HTTP标头。用户代理(User-Agent
)标头告诉网站发出请求的浏览器类型。Accept
标头告诉网站浏览器期望的内容类型。
使用GET
方法的请求(简称为GET
请求)是互联网上最常见的请求类型。GET
请求在Web服务器上获取由特定URL标识的特定资源。对GET
请求的响应将包含一个资源:可能是网页或图像,甚至是搜索请求的结果。代码清单2-1中的示例请求表示尝试加载example.com主页,是当用户在浏览器的导航栏中输入example.com时生成的。
如果浏览器需要将信息发送到服务器,而不仅仅是获取数据,则通常使用POST
请求。当你在网页上填写表格并提交时,浏览器会发送POST
请求。因为POST
请求包含发送到服务器的信息,所以浏览器在HTTP标头之后的请求正文中发送该信息。
你将在第8章了解在向服务器发送数据时使用POST
而不是GET
请求的原因。错误地使用GET
请求进行检索资源以外的任何操作的网站,会容易受到跨站点请求伪造(CSRF)攻击。
在开发网站时,你可能还会遇到PUT
、PATCH
和DELETE
请求。它们分别用于上传、编辑或删除服务器上的资源,通常由嵌入在网页中的JavaScript触发。表2-1中列出了一些其他值得了解的方法。
表2-1 不常用的HTTP方法
一旦Web服务器接收到HTTP请求,它就会用HTTP响应回复用户代理。我们来分析一下响应的结构。
2. HTTP响应
Web服务器发回的HTTP响应以协议描述——一个三位数的状态码开始,通常还有一条状态消息指示是否可以满足请求。响应还包含提供元数据的标头,这些元数据指示浏览器如何处理内容。最后,大多数响应都包含一个正文,正文本身包含所请求的资源。代码清单2-2显示了一个简单的HTTP响应的内容。
代码清单2-2 来自example.com的HTTP响应
响应从协议描述、状态码和状态消息开始。格式为2xx
的状态码表示请求已被理解、接受并响应。格式为3xx
的代码会将客户端重定向到其他URL。格式为4xx
的代码表示客户端错误:浏览器生成了明显无效的请求。这种类型的最常见错误是HTTP 404 Not Found。格式为5xx
的代码表示服务器错误:请求有效,但服务器无法满足该请求。
接下来是HTTP标头。几乎所有的HTTP响应都包含一个Content-Type
标头,该标头指示返回的数据类型。对GET
请求的响应通常还包含Cache-Control
标头,以指示客户端应在本地缓存大型资源(例如,图像)。
如果HTTP响应成功,则正文包含客户端尝试访问的资源——通常是描述请求的网页结构的超文本标记语言(HTML)。在这种情况下,响应包含样式信息以及页面内容本身。其他类型的响应可能返回JavaScript代码,用于设置HTML样式的级联样式表(CSS)或正文中的二进制数据。