深入理解HTTP请求流程

以前写过一篇博客,叫做HTTP的报文分析:https://blog.csdn.net/ZripenYe/article/details/119593269但是感觉还是不太深入、不够全面,顶多了解个大概。
所以这篇博客更深入,更全面,篇幅自然也更长。


参考书目《Web安全深度剖析》张炳帅

随着时代的反正,C/S模式,即客户端/服务器模式逐渐转变为,B/S模式,即浏览器/服务器模式,现在目前我们大多数访问应用都是在一个浏览器上完成的。
当客户端与web服务器交互的时候,依托于HTTP请求。


HTTP协议解析

  • 超文本传输协议(英语:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是万维网的数据通信的基础。
  • HTTP允许将HTML从web服务器发送到web浏览器

发起HTTP请求

  • 如何发起一个HTTP请求?只需要输入一个URL,并且按回车就可以发送HTTP请求了。
  • 统一资源定位符(英语:Uniform Resource Locator,缩写:URL,或称统一资源定位器、定位地址、URL地址)俗称网页地址,简称网址,是因特网上标准的资源的地址(Address),如同在网络上的门牌。
  • 统一资源定位符的标准格式如下:
[协议类型]://[服务器地址]:[端口号]/[资源层级UNIX文件路径][文件名]?[查询]#[片段ID]
比如:
http://www.abc.com:8888/post/max.php?id=33
  • 我们可以借助浏览器发送HTTP请求,不借助浏览器也可以,比如Linux下的curl命令。严格来说,浏览器也是HTTP工具的一种

  • Windows中没有curl,需要下载curl.exe也可以达到命令行访问url

  • 也可以使用python爬虫脚本来实现url的访问,比如:https://blog.csdn.net/ZripenYe/article/details/119463072
    在这里插入图片描述

  • 脱离浏览器观察服务器响应的数据,你可以发现,就某些方面而言,浏览器只不过多了HTML渲染功能而已。

HTTP协议详解

  • 目前普遍使用的时HTTP1.1的版本
  • HTTP是一个无状态的协议。
  • 无状态是指Web浏览器和Web服务器之间不需要建立持久的链接
  • 就意味着客户端发送请求到服务器发送响应之后,连接就被关闭了,在服务器端不保留连接的有关信息。
  • 也就是说,HTTP请求只能由客户发起,服务器不能主动发起
  • HTTP遵循请求(Request)和响应(Response)模型:
    在这里插入图片描述

HTTP的请求与响应:

HTTP的请求
  • HTTP的请求有三部分:请求行(请求方法)、请求头(消息报头)、请求正文。
    在这里插入图片描述
  • HTTP请求报文的第一行即为请求行由三部分组成:
    • 第一部分说明这是:POST请求
    • 第二部分说明是请求该域名根目录下的 login.php文件
    • 第三部分说明这是HTTP 1.1版本
  • 第二行到空白处即为请求头,也称作消息头,一般含有很多元素
    • HOST代表请求的主机地址
    • Uer-Agent代表浏览器的标识。请求头由客户端自行决定,后面会详细解释各个元素
  • 空白之后是请求正文,请求正文是可选的,它最常出现在POST请求中
HTTP的响应
  • HTTP响应也由三部分组成:响应行、响应头(消息报头)、响应正文(消息主题)
    在这里插入图片描述
  • 第一行是响应行,由HTTP版本、状态码、以及消息“OK”
  • 第二行到空白行是响应头,由服务器向客户端发送
  • 从空白到结尾叫响应正文,是服务器向客户端发送的HTML代码

HTTP请求方法

HTTP请求方法非常多,常见的有GET和POST

GET方法
  • get方法用于获取请求页面的指定信息,以实体的格式。
  • 如果请求资源为非HTML,那么返回的是web容器解析之后的HTML源代码,而不是源文件。
  • 比如请求index.jsp,返回的不是index.jsp源文件,而是解析之后的源代码
  • 如下HTTP请求:
    在这里插入图片描述
  • 可以看到,使用GET请求index.php,并且id的参数为1.
  • 在服务器端脚本中可以选择性接收这些参数,意思就是,如果你是index.php/id=1&name=a,有可能没有接收name元素的代码,服务器就不会理会你多加入的内容,并且去查询数据,以完成一次HTTP请求。
HEAD方法
  • HEAD方法不会返回消息主体,其余和GET一样
  • 这种方法一般用来测试链接的有效性、可访问性和最近的改变
  • 不用返回消息主题,使得报文的大小减少,加快的响应速度,效率更高
POST方法
  • POST方法与GET方法类似,但是GET方法没有请求内容,而POST方法有请求内容。
  • POST请求多用于向服务器发送大量的数据。
  • GET虽然也能发送,但是URL的长度是有限制的,并且GET发送的数据会显示在浏览器端,而POST不会,所以POST的安全性更高
  • 例如,下面是一个经典的POST请求:
  • 这个POST请求传递了参数user和pw
PUT方法
  • PUT方法用于把请求中的实体存储在请求资源下
    • 如果请求资源在服务器中存在,则替换
    • 如果请求资源在服务器中不存在,则创建这个资源
      在这里插入图片描述
  • 如这个粗糙的图所示,PUT会请求input.txt,如果存在,则修改,不存在,创建input.txt,内容是123456
  • 因为这个可以直接在服务器上创建文件,服务器一般会关闭PUT方法,防止恶意攻击
DELETE方法
  • 请求删除服务器的指定资源
  • 一般几乎不可能在公网上看到能开这个方法的服务器
TRACE 方法
  • 很少见
  • 用来回显服务器收到的请求
  • 就是一般用来了解服务器另一端的情况,利用这些数据进行诊断
CONNECT方法
  • HTTP 1.1 保留CONNECT方法
  • 用于能动态切换到隧道的代理
OPTION方法
  • 请求获得URL标识的资源在请求/响应的通信过程中 可以使用的功能选项
  • 少见

更多方法请百度搜索,(谁知道CTF会出什么稀奇古怪的题目呢)

HTTP状态码

状态码用来描述服务器的响应信息,非常重要
有以下5种状态码:

  • 1xx:提示,表示已经成功接收,范围是100~101
  • 2xx:成功,服务器成功处理请求:范围200~206
  • 3xx:重定向,表示告诉浏览器访问的资源被移动,并告诉浏览器新的位置,这个时候浏览器将对新位置发送请求:范围 300~305
  • 4xx:错误,各种各样的错误出现,常见的是URL错误:范围: 400~415
  • 5xx:Web服务器错误,4开头的错误来源是用户,5开头的来源一般都是服务器本身,范围 500~505

常见状态码:

  • 200:请求成功,万事大吉
  • 302:重定向
  • 404:请求资源不存在
  • 400:请求有语法错误,服务器无法解析
  • 401:没有权限的请求
  • 403:服务器接收到请求,但是拒绝服务
  • 500:服务器内部错误
  • 503:服务器当前不能处理请求,可能过段时间恢复正常。

HTTP消息

HTTP消息又称HTTP头:分别有请求头、响应头、普通头和实体头,从名称上看我们可以知道它所处位置:

请求头:

请求头只在HTTP请求种,向服务器传递请求的附加信息和客户本身信息

  • Host:Host请求报头域主要用于被请求资源的Internet主机和端口号,比如www.abc.com:8080
  • User-Agent: 将客户自身的操作系统,浏览器和其他属性告诉服务器。服务器可以针对这些信息做出响应(或者记录)
  • Referer:这个值是一个URL,代表当前访问URL的上一个URL,也就是说,客户是从什么地方来到的本页面,比如一个购物网站,用户可能是从登录页面来的,那么 Referer:www.shop.com/login.php
  • Cookie:表示身份,老生常谈了
  • Range:Range表示可以请求的实体部分内容,多线程下载会用到此请求头。
    在这里插入图片描述
  • x-forward-for :即xxf头,它代表请求端的IP,可以有多个,以逗号隔开,比较重要
  • Accept:指定客户端接收哪些MIME类型的信息,比如Accept:text/html 表示客户端希望接收HTML脚本
  • Accpet-Charset :指定客户端接收的字符集,比如值为utf-8.如果没有设置,说明任何字符集都可以被接收
响应头
  • Sever :服务器使用的呃Web服务器名称,比如值为Apache或者Nginx
  • Set-cookie:向客户端设置Cookie,通过此头,可以清楚得看到服务器向客户端发送的Cookie
  • Last-Modified:告诉浏览器,资源的最后修改时间
  • Location:服务器通过这个头告诉浏览器去访问哪个页面,然后浏览器接收到后会立即去访问那个页面,和状态码302重定向搭配使用。
  • Refresh:告诉浏览器定时刷新浏览器
普通头

这些报头域用于所有的请求和响应消息,但是并不用于被传输的实体,只用于传输的消息。例如

  • Date:表示消息产生的时间
  • Connection:允许发送指定连接的选项
  • Cache-Control:指定缓存指令
    普通报头了解就可
实体头:

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

  • Content-Type:用于向接收方指示实体的介质类型。
  • Content-Encoding:指示已经被应用到实体的附加内容的编码
  • Content-Length:用于指明实体正文的长度,以字节的方式存储十进制数字表示
  • Last-Modified:指示资源最后一次修改的日期和时间
posted @ 2021-08-14 17:16  Zeker62  阅读(336)  评论(0编辑  收藏  举报