How to Using FiddlerEverywhere
Fiddler EveryWhere 环境安装
1. 安装
Fiddler 功能强大,同时占用空间小,能记录所有的客户端和服务器端的 http 和https 请求,方便测试人员进行接口测试。官方下载地址:https://www.telerik.com/fiddler/fiddler-everywhere 由于笔者使用的是Mac OS,而经典版的只支持Windows,所以我们这里下载最新版的Fiddler EveryWhere,安装步骤如下:
- 打开下载好的Flddler Everywhere.dmg, 弹出如下界面,点击Agree同意

- 将左侧Fiddler的LOGO拖拽到右侧的Applications文件夹即可完成安装

- 软件安装过程非常简单,读者可自行完成安装。笔者安装的 Fiddler Everywhere 为 3.0.1 版。安装完成后,启动 Fiddler Everywhere,出现如下图的欢迎界面(需要注册并登陆)。意思是你可以有三种方法去使用Fiddler:
- System Traffic Capturing(系统流量捕捉)
- Preconfigured Browser Capturing(预先配置的浏览器捕捉)
- Debug mobile devices(调试手机设备)

2. 使用
程序界面如下图所示:
图4 Fidder Everywhere界面示意图
- 工具条:即选项卡,可以选择实时流量抓取区(Live Traffic)和对接口进行测试(Composer),Fiddler Everywhere 的 Composer 比较类似 Postman ,接口测试起来非常方便
- 会话区:Fiddler Everywhere 捕获的流量会实时呈现在这里
- 请求存储区:用于存储接口
目前许多网站都会采用https 协议来进行传输,相比于 http 协议,主要是增加了传输加密和安全认证等功能,从而提高了传输的安全性。但需要注意的是,Fiddler 刚安装完成是并不能显示 https 协议的会话,需要进行相应的设置,并进行证书安装。Mac下操作步骤如下:
- 进入设置
图5 进入设置
Trust root certificate,信任根证书,并勾选Capture HTTPS traffic和Ignore server certificate errors(unsafe)即可,如下图所示:
图6 设置
为什么要先学fiddler? 学习接口测试必学http协议,如果直接先讲协议,为了更好的理解协议,先从抓包开始。结合抓包工具讲http协议更容易学一些。 为什么使用Fiddler Everywhere而不是经典版的Fiddler? Fiddler Everywhere是一款跨平台(Windows、Mac、Linux)的Web调试代理工具,本文将用Mac系统进行演示
Fiddler Everywhere 的使用
1. 证书问题
为什么需要证书?
先说结论:捕获HTTPS必须要导入Fiddler的证书。
知道什么是证书之前需要了解下 “非对称加密”
- 对称加密:客户端和服务器用一个秘钥加密和解密。对称加密效率高
- 非对称加密:将公钥公布于众,客户端拿公钥加密,服务器拿自己的私钥解密,这样即使数据被截获,别人也解密不出明文内容。效率低。
非对称加密有两个秘钥,公钥和私钥,而这两个秘钥只要用一个加密,另一个就能解密,我们正常加密数据用公钥加密,用私钥解密 而我们还有一种用法就是服务器发数据用私钥加密,客户端用公钥解密,那么客户如果用公钥正确解密出数据,那么就证明这个数据一定是服务器发的,因为私钥只有它知道,这个过程我们一般不叫加密,叫签名,也就是服务器对数据签个名,代表这个确确实实是它发的。 其实我们正常情况下因为对称加密效率虽高,但是不安全,因为它告诉对方秘钥的时候这个秘钥容易被截获,但是我们如果用非对称加密,安全是安全,效率又太低,所以一般采用对称加密来加密数据,非对称加密配送对称加密的秘钥。 因为公钥是在网络上进行传输的,那么假如遭遇了如下图所示的中间人攻击,那么A的私钥就可能是伪造的。那么如何验证公钥的合法性呢?------证书
什么是证书?
证书就是由认证机构,采用它们自己的私钥,对发送方的公钥和发送方的信息进行数字加密。各大CA(认证机构)的证书已经默认被添加到了浏览器和操作系统中。 服务器生成自己的密匙对——公钥和私钥 服务器在认证机构注册自己的公钥 认证机构(CA)用自己机构的私钥对,服务器的公钥进行数字签名并生成证书(里面带了这个签名过得公钥和服务器一些信息) 认证机构把证书给客户端 客户端用认证机构的公钥验证数字签名 认证成功后用里面带的服务器的公钥加密并发消息给服务器 服务器用自己的私钥解密 这样一来就可以解决数据传输的安全问题了 问题:
- 如果黑客在服务器在认证机构注册公钥的时候截取数据呢?
这个完全不用担心,CA证书的申请,流程很多,而且较为严格,比如准备很多文件,再比如CA那边如果通过后还会要申请方这边的管理员验证之类的。
- 认证机构的公钥咋传输的?如果黑客改了呢? 如果改了那么这个证书就不会验证成功,其实各大CA的公钥已经在系统和浏览器中内置了。看下边的例子:
百度的证书信息:
系统自带的CA证书:

抓包工具为什么需要导入证书?
1.客户端发一个HTTPS请求,被Fiddler拦截并且Fiddler伪装成客户端发请求给服务器
- 服务器向假装成客户端的FIddler返回了CA证书
- 自己制作了一张证书,假装服务器给客户端发了自己做的证书。获取服务器的公钥
- 客户端生成对称秘钥,并用Fiddler假冒的公钥加密发送
- Fiddler用自己的私钥解密获取对称秘钥
- ……
这样的话Fiddler能完全获取解析到双方加密的数据。
实验证明:
当我们正常访问百度,查看证书:
开启Fiddler后,我们再访问百度:

安装根证书
- 点击
Trust root certificate(Mac会需要输入系统密码) - 勾选
Capture HTTPS traffic - Save保存即可安装成功,就可以开始抓HTTPS啦(可能需要重启Fiddler Everywhere)

删除证书
如果之前装过一些fiddler证书,安装的姿势不对,导致新的证书不起作用,这时候需要先删掉之前的证书了
- 在启动台(Launchpad)的其他中找到钥匙串(Keychain Access),或者在聚焦搜索(spotlight search)中搜钥匙串(Keychain Access)也可以找到。

- 我们可以在Default keychains -> login -> Certificerts 中可以找到Fiddler的根证书
DO_NOT_TRUST_FiddlerRoot,右键即可删除。

2. 手机APP抓包
前言
fiddler在抓手机app的请求时候,通常也会抓到来自PC的请求,导致会话消息太多,那么如何把来自pc的请求过滤掉,只抓来自APP的请求呢? 必备环境: 1.电脑上已装fiddler 2.手机和电脑在同一局域网
设置
- Fiddler Everywhere -> Settings -> Connections,勾选
Allow remote computers to connect - 8866端口为Fiddler的监听端口,后续手机中会用到。我这里的端口默认是8866,具体的端口号按实际情况来。

查看本机IP
打开终端(Terminal),输入ifconfig(Windows下为ipconfig),找到IP,如下图:

手机设置代理
- 手机设置->WLAN设置->选择该wifi,点右边的箭头(有的手机是长按弹出选项框)。
- 将代理换为手动进行配置:
- 配置主机名:与主机IP保持一致
- 端口:8866(Fiddler的监听端口)
- 保存后即可抓取手机上的请求了

抓取HTTPS请求
- 如果app都是http请求,是不需要安装证书,能直接抓到的,如果是https请求,这时候手机就需要下载证书了
- 打开手机浏览器输入地址:
[主机IP]:[Fiddler端口],比如我这里是172.20.249.225:8866 - 出现如下画面,点箭头所指的位置,点击安装就可以了。
- 不同手机安装证书方法可能会有所差异

3. 查看GET和POST请求
前言
前面讲了关于Fiddler Everywhere抓包的一些基本配置,配置完之后就可以抓到我们想要的数据了,接下来就是如何去分析这些数据。
本篇以洛谷的请求为例,简单分析get与post数据有何不一样,以后也能分辨出哪些是get,哪些是post了。
GET请求
- 打开Fiddler Everywhere,然后浏览器输入
洛谷首页地址:https://www.luogu.com.cn/ - 点开右侧Inspectors下的Headers区域,查看Request Headers
- Request Headers区域里面的就是请求头信息,可以看到打开
洛谷首页的是get请求

POST请求
- 打开登录首页:https://www.luogu.com.cn/auth/login
- 输入账号和密码点击登录后,查看箭头所指的地方,可以看出是post请求

如何找出需要的请求
- 点开漏斗(Advanced Filters)

- 比如我们要只抓
洛谷的请求,那我们可以设置条件:url contains luogu.com.cn,如下图:

- APPLY后即可只抓取
洛谷的请求了
GET和POST请求的区别
- 关于get和post的功能上区别就不说了,大家自己查资料,这里主要从fiddler抓包的层面查看请求参数上的区别
- get请求的Raw参数查看,主要分三部分:
- 第1部分是请求url地址
- 第2部分是host地址
- 第3部分是请求头部信息header
- 再查看博客登录请求的Raw信息,post的信息分四部分。 –前面3块内容都一样,第3部分和第4部分中间会空一行 –第4部分内容就是post请求的请求body(get请求是没body的)

4. 工具介绍
本篇简单的介绍下fiddler界面的几块区域,以及各自区域到底是干什么用的,以便于更好的掌握这个工具

会话框
会话框主要查看请求的一些请求的一些基本信息,如# 、URL、HTTP Version、Result、Method、Process、Remote IP、Body Size、Comments,具体如下表:
| 字段 | 说明 |
|---|---|
| # | 这一栏是代表这个请求大概是什么内容 |
| URL | 请求的路径 |
| HTTP Version | HTTP的版本,如HTTP/1.1 |
| Result | HTTP状态码,如200(成功)、3xx(重定向相关)、4xx(找不到资源,一般是请求地址有问题)、5xx(一般是服务器本身的错误) |
| Method | 请求方法,如:GET、POST、HEAD、OPTIONS、PUT、PATCH、DELETE、CONNECT |
| Process | 进程 |
| Remote IP | 远程IP |
| Body Size | 请求产生的数据大小 |
| Comments | 类似于备注,可以右键一个请求进行Comment |
Request和Response

- Request是客户端发出去的数据,Response是服务端返回过来的数据,这两块区域功能差不多
- headers:请求头,这里包含client、cookies、transport等
- Params:请求时所带的参数
- cookies:查看cookie详情
- raw:查看一个完整请求的内容,可以直接复制
- body:经过格式化后的主体
decode解码
Fiddler Everywhere 会自动进行解码,无需再手动执行了
5. 接口测试(Composer)
前言
Fiddler最大的优势在于抓包,我们大部分使用的功能也在抓包的功能上,fiddler做接口测试也是非常方便的。 Fiddler Everywhere的Composer功能非常强大又简单易用,逐渐向Postman靠齐
Composer简介
点开右侧Composer区域,可以看到如下界面,就是测试接口的界面了

JSON数据
1.有些post的请求参数和返回参数是Json格式的,如洛谷的登录请求:https://www.luogu.com.cn/api/auth/userPassLogin
2.在登录页面手动输入账号和密码,登录成功。
3.找到这个登录成功的会话,查看json数据如下图:

模拟GET请求
- 在Composer区域地址栏输入博客首页:http://luogu.com.cn
- 选择GET请求,点Execute执行,请求就可以发送成功啦
- 请求成功下方的Response会生成会话记录,可以查看本条请求的响应详情

模拟POST请求(实战登陆洛谷)
这里的模拟POST请求我们以登陆洛谷为案例进行讲解。

洛谷登陆链接:https://www.luogu.com.cn/auth/login 如上图,洛谷的登陆需要输入用户名+密码+验证码才能登陆成功,从表面上来看,我们只需要两个接口就能登陆成功,一个是获取验证码的GET请求接口,一个是登陆的POST接口,先GET验证码,然后根据验证码加上我们的用户名和密码调用登陆接口进行登陆,但实际并非想象中的那么简单,以下为抓包流程:
1. 过滤
我们只需要抓取洛谷的接口,如下图,在Search栏输入洛谷的域名:luogu.com.cn,就只会抓取洛谷的请求了

2. 抓取验证码接口
在洛谷的登陆界面点击刷新验证码,抓到验证码的接口,可以在Response->Prieview中看到验证码的图像
为了方便接口测试,我们右键这个验证码请求->点击Edit in Composer,如下图:
可以发现接口的地址为:https://www.luogu.com.cn/api/verify/captcha?_t=1640680004860.4568。参数_t为时间,也就是距 1970 年 1 月 1 日之间的毫秒数,如下图:
我们还可以将这个请求进行保存,点击EXCUTE旁边的SAVE,输入请求的名称,选择所在的文件夹,点击SAVE保存即可,如下图:

3. 抓取登陆接口
我们在洛谷输入正确的用户名、密码和验证码后点击登陆。
在Fiddler中寻找刚才发送的登陆请求,由于我们已知洛谷的登陆请求为POST方法,所以可以根据Method排序去找POST请求。找到一个POST请求的Request区Body中有刚刚输入的账号/密码/验证码的信息,这个就是洛谷登陆接口了[https://www.luogu.com.cn/api/auth/userPassLogin](https://www.luogu.com.cn/api/auth/userPassLogin),如下图:
接下来我们还是跟步骤2一样存储一下这次的请求,右键登陆请求 -> Edit in Composer,然后SAVE一下Request(我这边把请求名称取名为了“登陆”),现在我们左下角的的Requests区就有了两个请求:

4. 测试登陆
按照最初的想法,先调用验证码接口,查看到验证码:zn22
然后使用zn22这个验证码加上我们自己的用户名密码去调用登陆接口,登陆请求的Body中有三个参数username、password、captcha分别对应着用户名、密码、验证码,这些我们根据实际情况去修改,如下图:
修改完请求体后点击EXCUTE执行,响应体中给我们提示报错了,提示会话超时,请刷新页面后重试:
出现这种类似的错误信息,原因一定出在请求的请求头中,服务器对请求头进行了限制,比如验证Cookies、和为了防止跨站攻击而设置的验证X-CSRF-TOKEN等,所以才会出现此类情况。
接下来,分析POST登陆请求的请求头:
Host:www.luogu.com.cn
Connection:keep-alive
Content-Length:82
sec-ch-ua:" Not A;Brand";v="99", "Chromium";v="96", "Google Chrome";v="96"
X-CSRF-TOKEN:1640768448:U3hwS2h4azHVGgygSHLD9oaY7Z+4Bf9U8VwT1rWLEYQ=
sec-ch-ua-mobile:?0
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36
Content-Type:application/json
Accept:application/json, text/plain, */*
X-Requested-With:XMLHttpRequest
sec-ch-ua-platform:"macOS"
Origin:https://www.luogu.com.cn
Sec-Fetch-Site:same-origin
Sec-Fetch-Mode:cors
Sec-Fetch-Dest:empty
Referer:https://www.luogu.com.cn/auth/login
Accept-Encoding:gzip, deflate, br
Accept-Language:en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7
Cookie:__client_id=d60b5430b77152d9bc168bca64ace8883254e127; _uid=0
上述的请求头中,除了X-CSRF-TOKEN和Cookie其他都不需要变动。
X-CSRF-TOKEN可以在GET https://www.luogu.com.cn/auth/login的Body中找到,如下图:
而Cookes可以在Response -> Cookies中找到,右键Value可以进行复制,如下图:
知道了这两个是如何获取的就可以继续我们的测试登陆了,具体步骤也就变成了:
- GET https://www.luogu.com.cn/auth/login,获取到
Cookies和X-CSRF-TOKEN,并记录下来。 - 带上
Cookies去GET https://www.luogu.com.cn/api/verify/captcha,记录下获取到的验证码。 - POST https://www.luogu.com.cn/api/auth/userPassLogin:需要修改Headers中的
Cookies和X-CSRF-TOKEN,请求体Body中的captcha参数更换为步骤二获取到的验证码。
登陆成功如下图,就可以拿syncToken以及响应的Cookies去请求需要登陆的接口了。

GET请求(URL详解)
前言
上一篇介绍了Composer的功能,可以模拟get和post请求,get请求有些是不带参数的,这种比较容易,直接放到url地址栏就行。有些get请求会带有参数,本篇详细介绍url地址格式。
url详解
- url就是我们平常打开百度在地址栏输入的:https://www.baidu.com,如下图,这个是最简单的url地址,打开的是百度的主页

- 再看一个稍微复杂一点的url,在百度输入框输入:洛谷

- 查看url地址栏,对比之前的百度首页url地址,后面多了很多参数。当然最主要的参数是:wd=上海悠悠博客园(后面的一大串可以暂时忽略)
- 那么问题来了,这些参数有什么作用呢? 可以做个简单的对比,在地址栏分别输入: https://www.baidu.com https://www.baidu.com/s?wd=洛谷 对比打开的页面有什么不一样,现在知道作用了吧,也就是说这个多的”/s?wd=洛谷”就是搜索的结果页面
url解析
- 以https://www.baidu.com/s?wd=洛谷这个URL请求为例
- 那么一个完整的url地址,基本格式:
https://host:port/path?xxx=aaa&ooo=bbb
- http/https:这个是协议类型,如图中所示
- host:服务器的IP地址或者域名,如图中2所示
- port:HTTP服务器的默认端口是80,这种情况下端口号可以省略。 如果使用了别的端口,必须指明,例如:192.168.3.111:8080,这里的8080就是端口
- path:访问资源的路径,如图中3所示/s (图中3是把path和请求参数放一起了)
- ?:url里面的?这个符号是个分割线,用来区分问号前面的是path,问号后面的是参数
- url-params:问号后面的是请求参数,格式:xxx=aaa,如图4区域就是请求参数
- &:多个参数用&符号连接
UrlEncode编码
- 如果url地址的参数带有中文的,一般在url里面会是这样的,如第二点里的wd=%E6%B4%9B%E8%B0%B7。像看到%B4这种编码的就是经过url编码过的,需要解码就能看到是什么中文了
- 用urlencode在线编码/解码工具,地址:https://www.urldecoder.org/

请求参数(params)
- 在url里面请求参数一般叫params,每个参数对应的都有name和value值
- 多个参数情况如下:

POST请求(body)
前言上一篇讲过get请求的参数都在url里,post的请求相对于get请求多了个body部分,本篇就详细讲解下body部分参数的几种形式。 注意:post请求的参数可以放在url,也可以放在body,也可以同时放在url和body,当然post请求也可以不带参数。 只是一般来说,post请求的参数习惯放到body部分
body数据类型
常见的post提交数据类型有四种:
- 第一种:application/json:这是最常见的json格式,也是非常友好的深受小伙伴喜欢的一种,比如:
{“input1”:”xxx”,”input2”:”ooo”,”remember”:false}
- 第二种:application/x-www-form-urlencoded:浏览器的原生 form 表单,如果不设置 enctype 属性,那么最终就会以 application/x-www-form-urlencoded 方式提交数
input1=xxx&input2=ooo&remember=false
- 第三种:multipart/form-data:这一种是表单格式的,数据类型如下:
WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form-data;
name=”file”;
filename=”chrome.png”
Content-Type: image/png PNG
content of chrome.png
WebKitFormBoundaryrGKCBY7qhFd3TrwA
- 第四种:text/xml:这种直接传的xml格式
<!--?xml version="1.0"?-->
<methodcall>
<methodname>examples.getStateName</methodname>
<params>
<param>
<value><i4>41</i4></value>
</param>
</params>
</methodcall>
x-www-form-urlencoded
浏览器的原生