第 1 章 Fiddler
1.1 抓 firefox 上 https 请求
fiddler 是一个很好的抓包工具,默认是抓 http 请求的,对于 pc 上的 https 请求,会提示
网页不安全,这时候需要在浏览器上安装证书。
1.1.1 fiddler 设置
1.打开菜单栏:Tools>Fiddler Options>HTTPS
2.勾选 Decrypt HTTPS traffic,里面的两个子菜单也一起勾选了
PS:fidder这里就不多说了直接上干货吧
1.2 查看 get 和 post 请求
1.2.1 get 请求
1.打开 fiddler 工具,然后浏览器输入博客首页地址:
http://www.cnblogs.com/yoyoketang/
2.点开右侧 Inspectors 下的 Headers 区域,查看 Request Headers
3.Request Headers 区域里面的就是请求头信息,可以看到打开博客园首页的是 get 请求
1.4.2 post 请求
1.打开登录首页:https://passport.cnblogs.com/user/signin
2.输入账号和密码登录成功后,查看 fiddler 抓包的请求头信息,可以看出是 post 请求
1.2.3 get 和 post 请求参数区别
1.关于 get 和 post 的功能上区别就不说了,大家自己查资料,这里主要从 fiddler 抓包的
层面查看请求参数上的区别
2.get 请求的 Raw 参数查看,主要分三部分:
–第 1 部分是请求 url 地址
–第 2 部分是 host 地址
–第 3 部分是请求头部信息 header
3.再查看博客登录请求的 Raw 信息,post 的信息分四部分。
–前面 3 块内容都一样,第 3 部分和第 4 部分中间会空一行
–第 4 部分内容就是 post 请求的请求 body(get 请求是没 body 的)
1.2.4 Request 和 Response
1.Request 是客户端发出去的数据,Response 是服务端返回过来的数据,这两块区域功能差不多
2.headers:请求头,这里包含 client、cookies、transport 等
3.webfroms:请求参数信息表格展示,更直观。可以直接该区域的参数
4.Auth:授权相关,如果现实如下两行,说明不需要授权
No Proxy-Authorization Header is present.
No Authorization Header is present.
5.cookies:查看 cookie 详情
6.raw:查看一个完整请求的内容,可以直接复制
7.json:查看 json 数据
8.xml:查看 xml 文件的信息
1.2.5 decode 解码
1.如果 response 的 TextView 区域出现乱码情况,可以直接点下方黄色区域解码
2.也可以选中上方快捷菜单 decode,这样后面的请求都会自动解码了
**
1.6 接口测试 Composer
Fiddler 最大的优势在于抓包,我们大部分使用的功能也在抓包的功能上,fiddler 做接口
测试也是非常方便的。
对应没有接口测试文档的时候,可以直接抓完包后,copy 请求参数,修改下就可以了。
**1.6.1 Composer 简介
点开右侧 Composer 区域,可以看到如下界面,就是测试接口的界面了
1.请求方式:点开可以勾选请求协议是 get、post 等
2.url 地址栏:输入请求的 url 地址
3.请求头:第三块区域可以输入请求头信息
4.请求 body:post 请求在此区域输入 body 信息
5.执行:Execute 按钮点击后就可以执行请求了
6.http 版本:可以勾选 http 版本
7.请求历史:执行完成后会在右侧 History 区域生成历史记录
1.6.2 模拟 get 请求(类似于postman)
1.在 Composer 区域地址栏输入博客首页:http://www.cnblogs.com/yoyoketang/
2.选择 get 请求,点 Execute 执行,请求就可以发送成功啦
3.请求发送成功后,左边会话框会生成一个会话记录,可以查看抓包详情
4.右侧 history 区域会多一个历史请求记录
5.会话框选中该记录,查看测试结果:
–选中该会话,点开 Inspectors
–response 区域点开 Raw 区域
–Raw 查看的是 HTML 源码的数据
–也可以点 WebView,查看返回的 web 页面数据
1.6.3 Json 数据
1.有些 post 的请求参数和返回参数是 Json 格式的,如博客园的登录请求:
https://passport.cnblogs.com/user/signin
2.查看 json 数据如下图
1.6.4 模拟 post 请求
1.请求类型勾选 post
2.url 地址栏输入对应的请求地址
3.body 区域写登录的 json 参数
4.header 请求头区域,可以把前面抓包的数据 copy 过来
(注意,有些请求如果请求头为空的话,会请求失败的)
5.执行成功后查看测试结果:
–执行成功如第三所示的图,显示 success=True
–执行失败如下图所示,显示
message=Invalid length for a Base-64 char array or string.
success=False
**
1.7 get 请求
**上一篇介绍了 Composer 的功能,可以模拟 get 和 post 请求,get 请求有些是不带参数的,
这种比较容易,直接放到 url 地址栏就行。有些 get 请求会带有参数,本篇详细介绍 url
地址格式。
1.7.1 url 详解
1.url 就是我们平常打开百度在地址栏输入的:https:www.baidu.com,如下图,这个是最简
单的 url 地址,打开的是百度的主页
2.再看一个稍微复杂一点的 url,在百度输入框输入:上海悠悠博客园
3.查看 url 地址栏,对比之前的百度首页 url 地址,后面多了很多参数。当然最主要的参数
是:wd=上海悠悠博客园(后面的一大串可以暂时忽略)。
4.那么问题来了,这些参数有什么作用呢?
可以做个简单的对比,在地址栏分别输入:
https:www.baidu.com
https://www.baidu.com/s?wd=上海悠悠博客园
对比打开的页面有什么不一样,现在知道作用了吧,也就是说这个多的"/s?wd=上海悠悠博
客园"就是搜索的结果页面
1.7.2 url 解析
以抓取的上面的Url为例子
一个完整的url地址基本格式如下
https://host:prot/path?xxx=aaa&ooo=bbb
–http/https:这个是协议类型
–host:服务器的 IP 地址或者域名
–port:HTTP 服务器的默认端口是 80,这种情况下端口号可以省略。
如果使用了别的端口,必须指明,例如:192.168.3.111:8080,这里的 8080 就是端口
–path:访问资源的路径,
–?:url 里面的?这个符号是个分割线,用来区分问号前面的是 path,问号后面的是参数
–url-params:问号后面的是请求参数,格式:xxx=aaa,
–&:多个参数用&符号连接
1.7.3 请求参数(params)
1.在 url 里面请求参数一般叫 params,但是我们在 fiddler 抓包工具看到的参数是:
QueryString
2.QueryString 是像服务端提交的参数,其实跟 params 是一个意思,每个参数对应的都有
name 和 value 值
3.多个参数情况如下
1.7.1 UrlEncode 编码
1.如果 url 地址的参数带有中文的,一般在 url 里面会是这样的,如第二点里的
wd=%E4%B8%8A%E6%B5%B7%E6%…
像看到%E4 这种编码的就是经过 url 编码过的,需要解码就能看到是什么中文了
2.用 urlencode 在线编码/解码工具,地址:
http://tool.chinaz.com/tools/urlencode.aspx
1.8 post 请求(body)
前言上一篇讲过get 请求的参数都在url里,post 的请求相对于get请求多了个 body部分,
本篇就详细讲解下 body 部分参数的几种形式。
1.8.1 body 数据类型
常见的 post 提交数据类型有四种:
1.第一种:application/json:这是最常见的 json 格式,也是非常友好的深受小伙伴喜欢
的一种,如下
{“input1”:“xxx”,“input2”:“ooo”,“remember”:false}
2.第二种:application/x-www-form-urlencoded:浏览器的原生 form 表单,如果不设置
enctype 属性,那么最终就会以 application/x-www-form-urlencoded 方式提交数
input1=xxx&input2=ooo&remember=fals
3.第三种:multipart/form-data:这一种是表单格式的,数据类型如下
------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form-data; name=“text”
title
------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form-data; name=“file”; filename=“chrome.png”
Content-Type: image/png
PNG … content of chrome.png …
------WebKitFormBoundaryrGKCBY7qhFd3TrwA–
4.第四种:text/xml:这种直接传的 xml 格式
1.8.2 json 格式
1.打开博客的登录页面,输入账号密码后抓包,查看 post 提交数据,点开 Raw 查看整个请求的原始数据
2.前面讲过 post 的请求多一个 body部分,上图红色区域就是博客园登录接口的 body 部分,
很明显这种格式是前面讲到的第一种 json 格式
3.查看 json 格式的树状结构,更友好,可以点开 JSON 菜单项
4.查看这里的 json 数据,很明显传了三个参数:
–input1:这个是登录的账号参数(加密过)
–input2:这个是登录的秘密参数(加密过)
–remember:这个是登录页面的勾选是否记住密码的选项,False 是不记住,True 是记住
1.8.3 x-www-form-urlencoded
1.登录博客园后,打开新随笔,随便写一个标题和一个正文后保存,抓包数据如下
2.如上图的这种格式,很明显就属于第二种了,这种类型的数据查看,在 WebFrom 里面查看
1.9 打断点 bpu
1.9.1 断点
1.为什么要打断点呢?
比如一个购买的金额输入框,输入框前端做了限制 100-1000,那么我们测试的时候,需要
测试小于 100 的情况下。很显然前端只能输入大于 100 的。这是我们可以先抓到接口,修改
请求参数,绕过前端,传一个小于 100 的数,检查服务端的功能是否 OK。
也就是说接口测试其实是不需要管前端的,主要测后端的功能。Fiddler 作为代理服务器的
作用其实就相当于上面故事里面的小王,传纸条的作用,Fiddler(小王)修改了请求参数(小
纸条),是为了验证服务端功能(女神 C)。
2.Fiddler 可以修改以下请求
–Fiddler 设置断点,可以修改 HTTP 请求头信息,如修改 Cookie,User-Agent 等
–可以修改请求数据,突破表单限制,提交任意数字,如充值最大 100,可以修改成 10000
–拦截响应数据,修改响应体,如修改服务端返回的页面数据
2.Fiddler 可以修改以下请求
–Fiddler 设置断点,可以修改 HTTP 请求头信息,如修改 Cookie,User-Agent 等
–可以修改请求数据,突破表单限制,提交任意数字,如充值最大 100,可以修改成 10000
–拦截响应数据,修改响应体,如修改服务端返回的页面数据
1.9.2 断点的两种方式
1.before response:这个是打在 request 请求的时候,未到达服务器之前
–屌丝 A 传给小王的时候,小王在这个时候拦截了小纸条,未传给女神 C
2.after response:也就是服务器响应之后,在 Fiddler 将响应传回给客户端之前。
–女神 C 回了小纸条,小王拿到后拦截了,未传给屌丝 A
1.9.3 全局断点
1.全局断点就是中断 fiddler 捕获的所有请求,先设置下,点击 rules-> automatic
breakpoint ->before requests
2.选中before requests选项后,打开博客园首页:http://www.cnblogs.com
看到如下 T 的标识,说明断点成功
3.打完断点后,会发现所有的请求都无法发出去了,这时候,点下 Go 按钮,就能走下一步
4.找到需要修改的请求后,选中该条会话,右侧打开 WebFroms,这时候里面的参数都是可以修改的了
1.9.4 单个断点
已经知道了某个接口的请求地址,这时候只需要针对这一条请求打断点调试,在命令行中输
入指令就可以
请求前断点(before response): bpu
- 论坛登录接口:https://passport.cnblogs.com/user/signin
- 命令行输入:bpu https://passport.cnblogs.com/user/signin 回车
3.请求登录接口的时候,就会只拦截登录这个接口了,此时可以修改任意请求参数
4.取消断点,在命令行输入: bpu 回车就可以了
响应后断点(after requests): bpafter - 论坛登录接口:https://passport.cnblogs.com/user/signin
- 在命令行输入:bpafter https://passport.cnblogs.com/user/signin 回车
3.登录博客园,会发现已经拦截到登录后服务器返回的数据了,此时可以修改任意返回数据
4.取消断点,在命令行输入: bpafter 回车就可以了
1.9.5 拦截来自某个网站所有请求
1.在命令行输入:bpu www.cnblogs.com
2.打开博客园任意网页,发现都被拦截到了
3.打开博客园其他网站,其它网站可以正常请求
4.说明只拦截了来自部落论坛(www.cnblogs.com)的请求
5.清除输入 bpu 回车即可
1.9.6 命令行其它相关指令
Bpafter, Bps, bpv, bpm, bpu
这几个命令主要用于批量设置断点
Bpafter xxx: 中断 URL 包含指定字符的全部 session 响应
Bps xxx: 中断 HTTP 响应状态为指定字符的全部 session 响应
Bpv xxx: 中断指定请求方式的全部 session 响应
Bpm xxx: 中断指定请求方式的全部 session 响应 、、同于 bpv xxx
Bpu xxx:与 bpafter 类似
当这些命令没有加参数时,会清空所有设置了断点的 HTTP 请求。
更多的其他命令可以参考 Fiddler 官网手册
1.12 http 协议简介
1.12.1 什么是 http
1.HTTP 协议是 Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从
万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。
2.HTTP(HyperText Transfer Protocol)协议是基于 TCP 的应用层协议,它不关心
数据传输的细节,主要是用来规定客户端和服务端的数据传输格式,最初是用来向客户端传
输 HTML 页面的内容。默认端口是 80
3.http(超文本传输协议)是一个基于请求与响应模式的、无状态的、应用层的协议
1.12.2 请求报文
1.HTTP 请求报文主要由请求行、请求头部、空一行、请求正文 4 部分组成
(当然,如果不算空的一行,那就是 3 个部分)
2.下图是 fiddler 工具抓的 post 请求报文(工具使用看 fiddler 篇),可以对照上图,
更清楚的理解 http 的请求报文内容。
1.12.3 响应报文
2.下图就是一个请求的响应内容,用 fiddler 抓包工具可以查看
1.12.4 完整的 http 内容
1.一个完整的 http 协议其实就两块内容,一个是发的请求,一个服务端给的响应。
2.以下是请求 https://github.com/timeline.json 这个地址后,用 fiddler 抓包导出
为文本,查看完整的 http 请求内容。(具体操作查看《fiddler 1.10 会话保存》)
1.13.1 8 种请求方法
1.请求行有三个主要参数:请求方法、url、协议版本。
2.请求方法包含:
- get
请求指定的页面信息,并返回实体主体 - post
向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。
POST 请求可能会导致新的资源的建立和/或已有资源的修改。 - HEAD
类似于 get 请求,只不过返回的响应中没有具体的内容,用于获取报头 - OPTIONS
返回服务器针对特定资源所支持的 HTTP 请求方法,也可以利用向 web 服务器发送‘*’的请
求来测试服务器的功能性 - PUT
向指定资源位置上传其最新内容 - DELETE
请求服务器删除 Request-URL 所标识的资源 - TRACE
回显服务器收到的请求,主要用于测试或诊断
8) CONNECT
HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。
注意:
1)方法名称是区分大小写的。
2)最常见的的就是通常说的 get 和 post 方法。
1.13.2 url 详解
1.打开百度,在搜索框输入任意文字,搜索后,复制地址栏的 url 地址:
https://www.baidu.com/s?wd=%E4%B8%8A%E6%B5%B7%E6%82%A0%E6%82%A0%E5%8D%9A%E5%AE%
A2&rsv_spt=1&rsv_iqid=0x91baaabd00070ba2&issp=1&f=8&rsv_bp=1&rsv_idx=2
2.那么一个完整的 url 地址,基本格式如下:
https://host:port/path?xxx=aaa&ooo=bbb
–http/https:这个是协议类型,如图中 1 所示
–host:服务器的 IP 地址或者域名,如图中 2 所示
–port:HTTP 服务器的默认端口是 80,这种情况下端口号可以省略。
如果使用了别的端口,必须指明,例如:192.168.3.111:8080,这里的 8080 就是端口
–path:访问资源的路径,如图中 3 所示/s (图中 3 是把 path 和请求参数放一起了)
–?:url 里面的?这个符号是个分割线,用来区分问号前面的是 path,问号后面的是参数
–url-params:问号后面的是请求参数,格式:xxx=aaa,如图 4 区域就是请求参数
–&:多个参数用&符号连接