深入理解HTTP的请求流程


前言

随着Web 2.0的时代到来,互联网从传统的C/S架构转变为便捷的B/S架构,B/S即浏览器/服务器架构。当客户端与Web服务器进行交互时,就存在Web请求,这种请求都基于统一的应用层协议(HTTP协议)交互数据。

一、HTTP是什么?

HTTP即超文本传输协议,是一种详细定义了浏览器和万维网服务器之间相互通信的规则,它是万维网交换信息的基础,它允许将HTML文本从Web服务器传送到Web浏览器。

1.发起HTTP请求

通常人们都通过在浏览器的地址栏中输入一个URL来发起HTTP请求,如果不借助浏览器该怎样发起HTTP请求呢?,,,在Linux中使用curl命令。在Windows中也可以使用curl.exe工具发起HTTP请求,例如在Windows平台下使用curl http://www.baidu.com可以返回百度首页的HTML数据:

PS C:\Users\Administrator> curl http://www.baidu.com


StatusCode        : 200
StatusDescription : OK
Content           : <!DOCTYPE html><!--STATUS OK--><html><head><meta http-equiv="Content-Type" content="text/html;chars
                    et=utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><meta content="always" name
                    ="...
RawContent        : HTTP/1.1 200 OK
                    Connection: keep-alive
                    Content-Security-Policy: frame-ancestors 'self' https://chat.baidu.com http://mirror-chat.baidu.com
                     https://fj-chat.baidu.com https://hba-chat.baidu.com https:...
Forms             : {form}
Headers           : {[Connection, keep-alive], [Content-Security-Policy, frame-ancestors 'self' https://chat.baidu.com
                    http://mirror-chat.baidu.com https://fj-chat.baidu.com https://hba-chat.baidu.com https://hbe-chat.
                    baidu.com https://njjs-chat.baidu.com https://nj-chat.baidu.com https://hna-chat.baidu.com https://
                    hnb-chat.baidu.com http://debug.baidu-int.com;], [Content-Length, 398573], [Content-Type, text/html
                    ; charset=utf-8]...}
Images            : {@{innerHTML=; innerText=; outerHTML=<img src="https://dss0.bdstatic.com/5aV1bjqh_Q23odCf/static/su
                    perman/img/topnav/newfanyi-da0cea8f7e.png">; outerText=; tagName=IMG; src=https://dss0.bdstatic.com
                    /5aV1bjqh_Q23odCf/static/superman/img/topnav/newfanyi-da0cea8f7e.png}, @{innerHTML=; innerText=; ou
                    terHTML=<img src="https://dss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/topnav/newxueshuic
                    on-a5314d5c83.png">; outerText=; tagName=IMG; src=https://dss0.bdstatic.com/5aV1bjqh_Q23odCf/static
                    /superman/img/topnav/newxueshuicon-a5314d5c83.png}, @{innerHTML=; innerText=; outerHTML=<img src="h
                    ttps://dss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/topnav/newwenku-d8c9b7b0fb.png">; out
                    erText=; tagName=IMG; src=https://dss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/topnav/new
                    wenku-d8c9b7b0fb.png}, @{innerHTML=; innerText=; outerHTML=<img src="https://dss0.bdstatic.com/5aV1
                    bjqh_Q23odCf/static/superman/img/topnav/newbaike-889054f349.png">; outerText=; tagName=IMG; src=htt
                    ps://dss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/topnav/newbaike-889054f349.png}...}
InputFields       : {@{innerHTML=; innerText=; outerHTML=<input name="ie" type="hidden" value="utf-8">; outerText=; tag
                    Name=INPUT; name=ie; type=hidden; value=utf-8}, @{innerHTML=; innerText=; outerHTML=<input name="f"
                     type="hidden" value="8">; outerText=; tagName=INPUT; name=f; type=hidden; value=8}, @{innerHTML=;
                    innerText=; outerHTML=<input name="rsv_bp" type="hidden" value="1">; outerText=; tagName=INPUT; nam
                    e=rsv_bp; type=hidden; value=1}, @{innerHTML=; innerText=; outerHTML=<input name="rsv_idx" type="hi
                    dden" value="1">; outerText=; tagName=INPUT; name=rsv_idx; type=hidden; value=1}...}
Links             : {@{innerHTML=; innerText=; outerHTML=<a tabindex="0" id="aging-total-page" role="pagedescription" a
                    ria-label="欢迎进入 百度一下,你就知道,盲人用户进入读屏幕模式请按快捷键Ctrl加Alt加R;阅读详细操作
                    说明请按快捷键Ctrl加Alt加问号键。" href="javascript:void(0)"></a>; outerText=; tagName=A; tabindex=
                    0; id=aging-total-page; role=pagedescription; aria-label=欢迎进入 百度一下,你就知道,盲人用户进入
                    读屏幕模式请按快捷键Ctrl加Alt加R;阅读详细操作说明请按快捷键Ctrl加Alt加问号键。; href=javascript:vo
                    id(0)}, @{innerHTML=百度首页; innerText=百度首页; outerHTML=<a class="toindex" href="/">百度首页</a
                    >; outerText=百度首页; tagName=A; class=toindex; href=/}, @{innerHTML=设置<i class="c-icon c-icon-t
                    riangle-down"></i>; innerText=设置; outerHTML=<a name="tj_settingicon" class="pf" href="javascript:
                    ;">设置<i class="c-icon c-icon-triangle-down"></i></a>; outerText=设置; tagName=A; name=tj_settingi
                    con; class=pf; href=javascript:;}, @{innerHTML=登录; innerText=登录; outerHTML=<a name="tj_login" c
                    lass="lb" onclick="return false;" href="https://passport.baidu.com/v2/?login&amp;tpl=mn&amp;u=http%
                    3A%2F%2Fwww.baidu.com%2F&amp;sms=5">登录</a>; outerText=登录; tagName=A; name=tj_login; class=lb; o
                    nclick=return false;; href=https://passport.baidu.com/v2/?login&amp;tpl=mn&amp;u=http%3A%2F%2Fwww.b
                    aidu.com%2F&amp;sms=5}...}
ParsedHtml        : System.__ComObject
RawContentLength  : 398573

这个就是百度首页的HTML数据,当然了,在实际Web渗透测试中,我们只需要查看访问URL后服务器返回的HTTP响应头。加上-l选项即可。

C:\Users\Administrator>curl -I www.baidu.com
HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 398536
Content-Security-Policy: frame-ancestors 'self' https://chat.baidu.com http://mirror-chat.baidu.com https://fj-chat.baidu.com https://hba-chat.baidu.com https://hbe-chat.baidu.com https://njjs-chat.baidu.com https://nj-chat.baidu.com https://hna-chat.baidu.com https://hnb-chat.baidu.com http://debug.baidu-int.com;
Content-Type: text/html; charset=utf-8
Date: Wed, 11 Oct 2023 04:54:39 GMT
Server: BWS/1.1
Set-Cookie: BIDUPSID=41928FC21C8EE85FCC6E602F76E16F25; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: PSTM=1697000079; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: BAIDUID=41928FC21C8EE85FCC6E602F76E16F25:FG=1; Path=/; Domain=baidu.com; Max-Age=31536000
Set-Cookie: BAIDUID_BFESS=41928FC21C8EE85FCC6E602F76E16F25:FG=1; Path=/; Domain=baidu.com; Max-Age=31536000; Secure; SameSite=None
Traceid: 1697000079237278951414207931623973850145
Vary: Accept-Encoding
X-Ua-Compatible: IE=Edge,chrome=1

此时脱离了浏览器来获取服务器响应的HTML数据。显然,浏览器在HTTP协议方面只不过多了HTML渲染功能,让用户更直观的查看页面。

2.HTTP协议详解

HTTP协议目前最新版本是1.1,HTTP是一种无状态的协议。无状态是指Web浏览器与Web服务器之间不需要建立持久的连接。
HTTP遵循请求(Request)/应答(Response)模型,Web浏览器向Web服务器发送请求时,Web服务器处理请求并返回适当的应答。

2.1.HTTP请求与响应

a.HTTP请求
POST /login.php HTTP/1.1       //请求行
HOST:www.xxser.com				//请求头
User-Argent: Mozilla/5.0 (Windows NT 6.1; rv:15.0) Gecko/20100101 Firefox/15.0
       // 空白行,代表请求头结束
Username=admin&password=admin     //请求正文

下面是我在Firefox上请求www.baidu.com的请求

GET /index.php?tn=monline_3_dg HTTP/1.1  //请求行
Host: www.baidu.com//请求头
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/116.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1

从上面的两个例子看到第一行的请求行有3部分组成

  1. 第一部分说明了请求类型,这两个例子分别是post和get
  2. 第二部分是由/开头用来请求该域名根目录下单文件
  3. 第三部分是HTTP版本,这两个例子都是HTTP/1.1

第二行至末尾空白行为请求头。
最后一部分是请求正文,请求正文是可选的,他经常出现在POST请求方法中。

b.HTTP响应

下面是浏览器请求ww.baidu.com的响应

HTTP/1.1 200 OK //响应行
Connection: keep-alive  //响应头
Content-Encoding: gzip
Content-Security-Policy: frame-ancestors 'self' https://chat.baidu.com http://mirror-chat.baidu.com https://fj-chat.baidu.com https://hba-chat.baidu.com https://hbe-chat.baidu.com https://njjs-chat.baidu.com https://nj-chat.baidu.com https://hna-chat.baidu.com https://hnb-chat.baidu.com http://debug.baidu-int.com;
Content-Type: text/html; charset=utf-8
Date: Wed, 11 Oct 2023 05:28:26 GMT
P3p: CP=" OTI DSP COR IVA OUR IND COM "
Server: BWS/1.1
Set-Cookie: BDRCVFR[Fc9oatPmwxn]=aeXf-1x8UdYcs; path=/; domain=.baidu.com
Traceid: 1697002106019070260213461619715571149375
X-Ua-Compatible: IE=Edge,chrome=1
Transfer-Encoding: chunked
//-------------在这之后是响应正文或消息主题---------------

消息报头之后是响应正文,由服务器向客户端发送的HTML数据

2.2,HTTP请求方法

HTTP请求方法非常多,其中GET,POST最常见。下面是HTTP请求方法的详细介绍:

(1),GET

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

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

其中id=1是参数,一般都是由开发者内定好的参数才会接受。

(2),HEAD

HEAD方法除了不能再响应里返回消息主体外,其它都与GET方法相同。此方法用来测试超文本链接的有效性,可访问性和最近的改变。

HEAD /index.php?id=1 HTTP/1.1
HOST: www.baidu.com
(3),POST

与GET方法类似,但是GET方法没有请求内容,而POST方法是有请求内容的。POST请求最多用于向服务器发送大量的数据。GET请求会将发送的数据显示再浏览器端,而POST不会,因此安全性较高。
例如,上传文件,提交留言等只要是向服务器发送大量数据,通常都会使用POST请求。

POST /login.php HTTP/1.1//请求行
Host: www.baidu.com   //请求头
Centent-Length:26
Accept:text/html
Origin:http//home.2co.com
User-Agent:Mozilla/5.0 (Windows NT 6.0) AppleWebKit/654.17 (KHTML,like Gecko)
Chrome/24.0.1312.57 Safari/537.17 SE 2.X MetaSr 1.0
Content-Type:application/x-www-from-urlencoded
Accept-Language:zh-CN,zh;q=0.8
Accept-Charset:GBK,utf-8;q=0.7,*;q=0.3

User=admins&pw=123456789  //请求正文

用POST方法请求login.php,并且传递参数参数User=admins&pw=123456789

(4),PUT

PUT方法用于请求服务器把请求中的实体存储在请求资源下,如果请求资源已经在服务器中存在,那么将会用此请求中的数据替换原先的数据,最为指定资源的最新修改版。意思就是上传文件。

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

123456

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

(5),DELETE

DELETE方法用于请求服务器删除请求的指定资源,服务器一般都会关闭此方法。

(6),TRACE

TRACE方法用于激发一个远程应用层的请求消息回路,即回显服务器收到的请求。

(7),CONNECT

为了能动态切换到隧道的代理

(8),OPTIONS

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

OPTIONS / HTTP/1.1
HOST: www.baidu.com

HTTP/1.1 200 OK
Allow: OPTIONS,TRACE,GET,HEAD,POST
Server:Microsoft-IIS/7.5
Public:OPTIONS,TRACE,GET,HEAD,POST
X-Powered-By:ASP.NET
Date:Sun,14 Jul 2023 19:31:34 GMT
Content-Length: 0

更多详细的方法,请参考:RFC-2616

2.3.HTTP状态码

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

HTTP/1.1 200 OK  //响应行

第一位数字定义了响应的类别,且只有一下五种:

  1. 1xxx:信息提示,表示请求已成功接收,继续处理。其范围为100-101
  2. 2xx:成功,服务器成功的处理了请求。范围为200-206
  3. 3xx:重定向,要访问的资源已被移动,并告诉新的资源地址位置。300-305
  4. 4xx:客户端错误状态码400-415
  5. 5xx:服务器内部错误500-505

常见状态码:

  1. 200:客户端请求成功
  2. 302:重定向
  3. 404:请求的资源不存在
  4. 401:请求未经授权
  5. 403:服务器拒绝提供服务
  6. 500:服务器内部错误
  7. 503:服务器暂时不能处理用户请求,一段时间后可恢复正常

2.4.HTTP消息

HTTP消息又称为HTTP头,由四部分组成:

2.4.1.请求头

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

  1. Host
  2. User-Agent
  3. Referer
  4. Cookie
  5. Range
  6. x-forward-for
  7. Accept
  8. Accept-Charset
2.4.2.响应头

响应头是服务器根据请求向客户端发送的HTTP头。

  1. Server
  2. Set-Cookie
  3. Last-Modified
  4. Location
  5. Refresh
2.4.3.普通头

在普通头中,有少数报头用于所有的请求和响应信息,但并不用于被传输的实体,只是用于传输的消息:

  1. Date
  2. Connection
  3. Cache-Control
2.4.4.实体头

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

  1. Content-Type
  2. Content-Encoding
  3. Content-Length
  4. Last-Modified

3.模拟HTTP请求

在了解HTTP协议之后,通过实际操作来学习HTTP协议。
下面使用Telnet模拟HTTP请求来访问www.baidu.com

  1. 第一步打开CMD运行框:输入Telnet www.baidu.com 80后按回车键,利用快捷键“Ctrl+]”来进入Telnet回显
  2. 在编辑状态下输入GET /index.html HTTP/1.1,按回车键后接着输入Host:www.baidu.com,再通过连续按两次回车发送请求。
  3. 接受服务器返回数据。

下面是我做的示例:
示例
这里需要注意一点的是:输入速度必须要快,否则就会连接失败。哈哈😄,我试了好几次才成功!!

4.HTTP协议与HTTPS协议的区别

HTTP协议全称为:Hypertext Transfer Protocol over Secure Socket Layer,它是以安全为目标的HTTP通道,其实就是HTTP的安全版本
HTTP协议的安全基础是安全套接层SSL,即在HTTP下加入SSL层,也就是HTTPS通过安全传输机制进行传输数据。可以降低非侵入性拦截攻击的可能性。
主要区别:

  1. HTTP的信息是明文传输,HTTPS的信息是加密过的。
  2. HTTP采用80端口连接,而HTTPS采用443端口连接。
  3. HTTPS需要CA证书,一般免费的CA证书很少,需要缴费,也有些Web容器提供,如Tomcat。而HTTP协议不需要。
  4. HTTP连接是无状态的。而HTTPS协议是由HTTP+SSL协议构建的可进行加密传输,身份认证的网络协议。

感悟:

生活常常有许多的惊喜,仙人球自移栽后到目前没有出现状况。好开心,,希望它会伴我一直走下去。。。希望有幸看到这篇文章的朋友你好,不管这个世界多么的无奈,总还是有人会陪你走下去的,加油,陌生人。Web安全是网络安全的敲门砖,也是基础。这是我进入网络安全的第一篇文章,希望在以后的道路上越走越远。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BabyOne~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值