HTTP协议详解

HTTP 协议是一种无状态的协议,所谓的无状态是指 Web 浏览器与 Web 服务器之间不需要建立持久的连接。这意味着当一个 Web 客户端想服务端发出请求 (Request) ,然后 Web 服务端返回响应 (Response) ,连接就被关闭了。在服务端不保留连接的有关信息,也就是说,HTTP 请求只能由客户端发起,而服务器不能主动向客户端发送数据。

下面通过使用 Burpsuite 抓包工具抓取到的 HTTP 包来分析 HTTP 请求与响应。

1. HTTP 请求

在这里插入图片描述
HTTP 请求包括三部分:分别是:

  • 请求行 (请求方法)
  • 请求头 (消息报头)
  • 请求正文

其中,请求头与请求正文之间有一行空白行,代表请求头结束

2. HTTP响应

在这里插入图片描述
与 HTTP 请求对应的是 HTTP 响应,HTTP 响应也由三部分内容组成,分别是:

  • 响应行:其中有 HTTP 版本、状态码、以及消息“OK”
  • 响应头 (消息报头)
  • 响应正文 (消息主体)

响应头与响应正文之间也有一行空白行,代表响应头结束。


HTTP 请求方法

① GET

GET 方法用于获取页面指定的信息 (以实体的格式)。如果请求资源为动态脚本 (非 HTML),那么返回文本是 Web 容器解析后的 HTML 源代码,而不是源文件。例如:请求 index.jsp,返回的不是 index.jsp 的源文件,而是经过解析后的 HTML 代码。

如下 HTTP 请求:

GET /index.php?id=1 HTTP/1.1
HOST: www.aaa.com

使用 GET 请求 index.php,并且 id 参数为 1。在服务器端脚本语言中可以选择性地接收这些参数。一般都是由开发者内定好的参数项目才会接收,若是加了其他参数项,服务器端脚本不会理会你加入的内容,任然只会接收内定好的参数,并且去查询数据,最终向 Web 客户端发送解析过的 HTML 数据。

2. POST

POST 方法也与 GET 方法相似,但最大的区别在于:GET 方法没有请求内容,而 POST 是有请求内容的。POST 请求多用于向服务器发送大量的数据,GET 虽然也能发送数据,但是有大小 (长度) 的限制,并且 GET 请求会将发送的数据显示在浏览器端,而 POST 不会,所以 POST 的安全性相对来说高一点。

一个经典的 POST 请求:
在这里插入图片描述

3. HEAD

HEAD 方法除了服务器不能在响应里返回消息主体外,其他斗鱼 GET 方法相同。此方法常被用来测试超文本链接的有效性、可访问性和最近的改变

攻击者在编写扫描工具时,就常用此方法,因为只需要测试资源是否存在,而不用返回消息主体,所以速度一定最快。

一个经典的 HEAD 请求如下:
在这里插入图片描述

4. PUT

PUT 方法用于请求服务器把请求中的实体存储在请求资源下。
如果请求资源已经在服务器中存在,那么将会用此请求中的数据替换原先的数据,作为制定资源的最新修改版;若请求制定的资源不存在,则会创建这个资源,且数据为请求正文

一个经典的 PUT 请求如下:

PUT /input.txt
HOST: www.xxser.com
Content-Length:6

123456

这段 HTTP PUT 请求将会在主机根目录下创建 input.txt,内容为 123456。通常情况下,服务器都会关闭 PUT 方法,因为它会为服务器建立文件,属于危险的方法之一。

5. DELETE

DELETE 方法用于请求源服务器删除请求的指定资源。
服务器一般都会关闭此方法,因为客户端可以进行删除文件操作,属于危险方法。

6. TRACE

TRACE 方法被用于激发一个远程的应用层请求消息回路,也就是说,回显服务器收到的请求。TRACE 方法允许客户端去了解数据被请求链的另一端接收的情况,并且利用了哪些数据信息去测试或诊断。但此方法非常少见

7. CONNECT

CONNECT 方法是为了能动态切换到隧道的代理。

8. OPTIONS

OPTIONS 方法是用于请求获得由 URL 标识的资源在 请求/响应 的通信过程中可以使用的功能选项。通过这个方法,客户端可以在采取具体资源请求之间,决定对该资源采取何种必要措施,或者了解服务器的性能。

常见的 OPTIONS 请求和响应如下:
在这里插入图片描述

WebDAV

WebDAV (Web-based Distributed Authoring and Versioning) 不是 HTTP/1.1 中的标准方法,是一种基于 HTTP/1.1 的通信协议,它扩展了 HTTP 1.1,在 GET、POST、HEAD 等几个 HTTP 标准方法以外添加了一些心得方法,使应用程序可直接对 Web Server 进行读写,并支持写文件锁定 (Locking) 和 解锁 (Unlock)、文件复制 (Copy)、文件移动 (Move)。另外还可以支持文件的版本控制。


HTTP 状态码

当客户端发出 HTTP 请求,服务器端接收后,会向客户端发送相应信息,其中,HTTP 相应中的第一行中,最重要的一点就是 HTTP 的状态码。

HTTP 协议中的状态码由 3 位数字组成,第一位数字定义了相应的类别,且只有一下 5 种:

  • 1xx:信息提示,表示请求已被成功接收,继续处理,其范围为 100 ~ 101
  • 2xx:成功,服务器成功地处理了请求,其范围为 200 ~ 206
  • 3xx:重定向,重定向状态码用于高速浏览器客户端,它们访问的资源已被移动,并高速客户端新的资源地址位置。这时浏览器会自动重新对新资源发起请求,其范围为 300 ~ 305
  • 4xx:客户端错误状态码,有时客户端会发送一些服务器无法处理的东西,比如格式错误的请求,或是请求一个不存在的 URL,其范围为 400 ~ 415
  • 5xx:服务端错误状态码,有时候客户端发送了一条有效请求,但 Web 服务自身却出错了,可能是 Web 服务器运行出错了,或者网站挂了,其范围为 500 ~ 505

常见的状态码描述如下:

  • 200:客户端请求成功
  • 302:重定向
  • 404:请求资源不存在
  • 400:客户端请求有语法错误
  • 401:请求未经授权
  • 403:服务器收到请求,但是拒绝提供服务
  • 404:请求资源不存在
  • 500:服务器内部错误
  • 503:服务器当前不能处理客户端的请求,一段时间后可能恢复正常

HTTP 消息

HTTP 消息又称为 HTTP 头,由四部分组成,分别是 请求头、响应头、普通头、实体头

1. 请求头

请求头只出现在 HTTP 请求中,请求报头允许客户端向服务器端传递请求的附加信息和客户端自身的信息。

常用的 HTTP 请求头如下:
① Host
Host 请求报头域主要用于指定被请求资源的 Internet 主机和端口号。

② User-Agent
User-Agent 请求报头域允许客户端将它的操作系统、浏览器和其他属性告诉服务器。

③ Referer
Referer 包含一个 URL,代表当前访问 URL 的上一个 URL,也就是说,用户是从什么地方来到本页面的。

④ Cookie
Cookie 是非常重要的请求头,它是一段文本,场用来表示请求者身份等。

⑤ Range
Range 可以请求实体的部分内容,多线程下载一定会用到此请求头
如:表示头 500 字节:bytes=0~499;表示第二个 500 字节:bytes=500~999;表示最后 500 劫:bytes=-500;表示 500 字节以后的范围:bytes=500-。

⑥ x-forward-for
x-forward-for 即 XXF 头,它代表请求端的 IP,可以有多个,中间以逗号隔开。

⑦ Accept
Accept 请求报头域用于指定客户端接收哪些 MIME 类信息。如:Accept: text/html 表明客户端希望接收 HTML 文本。

⑧ Accept-Charset
Accept-Charset 请求报头域用于指定客户端接收的字符集。例如:Accept-Charset: iso-8859-1,gb2312。如果请求消息中没有设置这个域,默认是 任何字符集都可以接收。

⑨ Accept-Encoding
客户端能能够进行的数据编码方式。

⑩ Accept-Language
客户端所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到。

⑪ Authorization
授权信息

⑫ Connection
表示是否需要持久连接。HTTP/1.1 默认进行持久连接。

⑬ Content-Length
表示请求消息正文的长度。

响应头

① Server
服务器所使用的 Web 服务器名称。攻击者可以通过查看此头探测 Web 服务器名称。所以建议在服务器端修改此头的信息。

② Set-Cookie
向客户端设置 Cookie,通过查看此头,可以看到服务器向客户端发送的 Cookie 信息。

③ Last-Modified
服务器通过这个头告诉浏览器,资源的最后修改时间。

④ Location
服务器通过这个头告诉浏览器去访问哪个页面,浏览器收到这个请求后,通常会立刻访问 Location 头所指向的页面。这个头通常配合 302 状态码使用。

⑤ Refresh
服务器通过 Refresh 头告诉浏览器定时刷新浏览器。

⑥ WWW-Authenticate
服务器通过此头告诉浏览器应该在 Authorization 头中提供什么类型的授权信息,在包含 401 状态码的响应头中这个是必须的。

⑦ Expires
告诉浏览器应该在什么时候认为文档已经过期,从而不再缓存它。

⑧ Content-Type
告诉浏览器后面的文档属于什么 MIME 类型。

普通头

在普通报头中,有毫安数报头域用于所有的请求和响应消息,但并不用于被传输的实体,只用于传输的消息。如:

  • Date:表示消息产生的日期和时间
  • Connection:允许发送指定连接的选项
  • Cache-Control:用于指定缓存指令,缓存指令是单向的且是独立的。
实体头

请求和响应消息都可以传送一个实体头。实体头定义了关于实体正文和请求所标识的资源的元信息。元信息也就是实体内容的属性,包括实体信息类型、长度、压缩方法、最后一次修改时间等。

① Content-Type
向接收方知识实体的介质类型。

② Content-Encoding
被用作媒体类型的修饰符,它的值指示了已经被应用到实体正文的附加内容的编码,因此要获得 Content-Type 报头域中所引用的媒体类型,必须采用相应的解码机制。

③ Content-Length
指明实体正文的长度,以字节方式存储的十进制数字表示。

④ Last-Modified
指示资源的最后修改日期和时间。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值