wireshark抓包分析get,post请求

前言

这里介绍一款网络抓包祖师爷级别的产品 wireshark,只要是计算机网络的包,他都可以抓,功能无上限。我们主要用它来抓取 http 的 get 和 post 请求,并分析

抓包的原理

当网卡接收到一个网络报文之后,它会遍历系统中所有已经注册的网络协议,例如以太网协议、x25协议处理模块来尝试进行报文的解析处理,这一点和一些文件系统的挂载相似,就是让系统中所有的已经注册的文件系统来进行尝试挂载,如果哪一个认为自己可以处理,那么就完成挂载。

Linux 抓包是通过注册一种虚拟的底层网络协议来获取对网络设备消息的处理权(偷窥)

http请求报文组成

一个 HTTP 请求报文由请求行(request line)、请求头部(header)、空行(blank line)和请求数据(request-body)4个部分组成。

请求行

请求行由 请求方法字段、URL 字段和 HTTP 协议版本字段,3个字段组成,它们用空格分隔。例如:

POST http://127.0.0.1:8001/ HTTP/1.1\r\n (其中\r\n代表换行)

请求头

请求头由(key-value)对组成,每行一对,以 \r\n 换行符结尾,关键字和值用英文冒号”:”分隔。请求头通知服务器有关于客户端请求的信息,典型的请求头有:

1
2
3
4
5
User-Agent:产生请求的浏览器类型。

Accept:客户端可识别的内容类型列表。

Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。

空行

最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头。在实际抓包中就是(\r\n)

请求数据(body主体)

请求数据不在 GET 方法中使用,而是在 POST 方法中使用。POST 方法适用于需要客户填写表单的场合,与请求数据相关的最常使用的请求头是Content-Type 和 Content-Length,用于指定请求数据的类型和长度

http 响应报文

HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行、响应正文,和 http 请求报文类似,区别最大的是在状态行上,他有更多的状态码。

1
2
3
4
5
6
7
8
9
10
11
12
200 OK - [GET]:服务器成功返回用户请求的数据,该操作是幂等的(Idempotent)。
201 CREATED - [POST/PUT/PATCH]:用户新建或修改数据成功。
202 Accepted - [*]:表示一个请求已经进入后台排队(异步任务)
204 NO CONTENT - [DELETE]:用户删除数据成功。
400 INVALID REQUEST - [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作,该操作是幂等的。
401 Unauthorized - [*]:表示用户没有权限(令牌、用户名、密码错误)。
403 Forbidden - [*] 表示用户得到授权(与401错误相对),但是访问是被禁止的。
404 NOT FOUND - [*]:用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的。
406 Not Acceptable - [GET]:用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)。
410 Gone -[GET]:用户请求的资源被永久删除,且不会再得到的。
422 Unprocesable entity - [POST/PUT/PATCH] 当创建一个对象时,发生一个验证错误。
500 INTERNAL SERVER ERROR - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。

实例

get请求实例

2017060148284screenshot_58.png

因为get请求参数一般都用ascii编码到url中,所以不含请求数据(request-body),当然你也可以强行放到request-body里面

post请求实例

2017060183621screenshot_59.png

post请求数据会被封装到body主体里

http响应报文

2017060188973screenshot_62.png

get和post的区别

核心原理上他们只有一点根本区别,简单点儿说,一个用于获取数据,一个用于创建修改数据,单纯了为了遵循 RESTFUL 设计理念(严格的 RESTFUL 规范来看 POST 只能用于创建)

但在使用过程中(只限于通常的使用方法,按照 http 规范,GET 数据放在 url,POST 数据放在 body)他们有如下区别:

1、GET在浏览器回退时是无害的,而 POST 会再次提交请求(浏览器回退重复请求) 2、GET 产生的 URL 地址可以被 Bookmark,而 POST 不可以(收藏夹) 3、GET 请求会被浏览器主动 cache,而POST不会,除非手动设置(浏览器缓存) 4、GET 请求只能进行 url 编码,而POST支持多种编码方式(对数据的编码方式,其实这点也不算区别,因为 POST 参数也可以放 url) 5、GET 请求参数会被完整保留在浏览器历史记录里,而 POST 中的参数不会被保留 6、GET 请求在 URL 中传送的参数是有长度限制的,而 POST 没有(这个长度限制是 web 服务器限制的或者浏览器限制的) 7、对参数的数据类型,GET 只接受 ASCII 字符,而 POST 没有限制。 8、GET 比 POST 更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。 9、GET 参数通过URL传递,POST 放在 Request body 中

你觉得get和post请求数据放的位置不一样?

get 请求数据其实也可以放到 body 里面,而 post 请求数据也可以放到 url 里面,我们通常不这么用是因为 http 协议的约定

get请求数据放在body里面:

201706014181screenshot_60.png

post请求数据放在url里面:

2017060157851screenshot_61.png

后端照样可以获取到数据。

你觉得get和post请求数据长度限制不一样

get 请求 url 的限制主要是浏览器端限制,其次是服务器操作系统限制,而 post 放在 body 里面其实也有长度限制(比如受到apache影响),排除这些差异,他们本质没有差异

总结

感觉造成大家有误解最根本原因

1.get,post太司空见惯了,每个人都可以发表意见,但意见不一定是对的

2.许多人都只看了表面,而没研究他底层所遵循的协议和规范,实际上怎么用还是靠约定

附录

关于url编码问题我没做分析,太混乱,和操作系统,浏览器,网页编码多种因素有关,这里引用阮一峰大神的总结

url编码详解

坚持原创技术分享,您的支持将鼓励我继续创作!