Fiddler基础知识
- Fiddler是强大的抓包工具,它的原理是以web代理服务器的形式进行工作的,使用的代理地址是:127.0.0.1,端口默认为8888,我们也可以通过设置进行修改。
- 代理就是在客户端和服务器之间设置一道关卡,客户端先将请求数据发送出去后,代理服务器会将数据包进行拦截,代理服务器再冒充客户端发送数据到服务器;同理,服务器将响应数据返回,代理服务器也会将数据拦截,再返回给客户端。
- Fiddler可以抓取支持http代理的任意程序的数据包,如果要抓取https会话,要先安装证书。
HTTP协议
- 要分析Fiddler抓取的数据包,我们首先要熟悉HTTP协议。HTTP即超文本传输协议,是一个基于请求与响应模式的、无状态的、应用层的协议,绝大多数的Web开发,都是构建在HTTP协议之上的Web应用。
- HTTP的工作过程:当我们请求一个超链接时,HTTP就开始工作了,客户端先发送一个请求到服务器,请求内容包括:协议版本号、请求地址、请求方式、请求头和请求参数;服务器收到请求后做相应的处理,并将响应数据返回到客户端,响应内容包括:协议版本号、状态码和响应数据。前端根据响应数据做相应的处理,就是最终我们看到的内容。这些过程是HTTP自动完成的,我们只是输入或点击请求地址,然后查看前端给我们展示的内容。更多关于HTTP协议的介绍请参考:http://www.cnblogs.com/li0803/archive/2008/11/03/1324746.html
- 请求方式常用的有:GET、PUT、POST、DELETE。
- HTTP状态码主要分为5类:以1开头的代表请求已被接受,需要继续处理;以2开头的代表请求已成功被服务器接收、理解、并接受;以3开头的代表需要客户端采取进一步的操作才能完成请求;以4开头的代表了客户端看起来可能发生了错误,妨碍了服务器的处理;以5开头的代表了服务器在处理请求的过程中有错误或者异常状态发生,也有可能是服务器意识到以当前的软硬件资源无法完成对请求的处理。
- 常见的主要有:200:服务器成功处理了请求;404:未找到资源;500:内部服务器错误;503:服务器目前无法为请求提供服务;302:请求的URL已临时转移;304:客户端的缓存资源是最新的,要客户端使用缓存。
- 每个状态码的详细介绍请参考:https://baike.baidu.com/item/HTTP%E7%8A%B6%E6%80%81%E7%A0%81/5053660?fr=aladdin
一、FIiddler请求界面图标解释:
名称 |
含义 |
---|---|
# |
抓取HTTP Request的顺序,从1开始,以此递增 |
Result |
HTTP状态码 |
Protocol |
请求使用的协议,如HTTP/HTTPS/FTP等 |
Host |
请求地址的主机名 |
URL |
请求资源的位置 |
Body |
该请求的大小 |
Caching |
请求的缓存过期时间或者缓存控制值 |
Content-Type |
请求响应的类型 |
Process |
发送此请求的进程:进程ID |
Comments |
允许用户为此回话添加备注 |
Custom |
允许用户设置自定义值 |
图标 |
含义 |
请求已经发往服务器 |
|
已从服务器下载响应结果 |
|
请求从断点处暂停 |
|
响应从断点处暂停 |
|
请求使用 HTTP 的 HEAD 方法,即响应没有内容(Body) |
|
请求使用 HTTP 的 POST 方法 |
|
请求使用 HTTP 的 CONNECT 方法,使用 HTTPS 协议建立连接隧道 |
|
响应是 HTML 格式 |
|
响应是一张图片 |
|
响应是脚本格式 |
|
响应是 CSS 格式 |
|
响应是 XML 格式 |
|
响应是 JSON 格式 |
|
响应是一个音频文件 |
|
响应是一个视频文件 |
|
响应是一个 SilverLight |
|
响应是一个 FLASH |
|
响应是一个字体 |
|
普通响应成功 |
|
响应是 HTTP/300、301、302、303 或 307 重定向 |
|
响应是 HTTP/304(无变更):使用缓存文件 |
|
响应需要客户端证书验证 |
|
服务端错误 |
|
会话被客户端、Fiddler 或者服务端终止 |
二、Fiddler右侧工具界面介绍
1、Statistics[性能统计器]
关于HTTP请求的性能以及数据分析。选中一条请求,点击右侧Statistics即可看到这条请求的一些性能数据。也可以shift选中多条一起查看。
附中英文版本的截图,对照着看下字段名称基本就能理解了:
2、Inspectors[会话监视器]
这是我们最常用的窗口,用于查看会话的内容,上半部分是请求的内容,下半部分是响应的内容。
会把请求和响应解析成清晰的格式,出入参对应的值都可以很清晰的展示,对于写接口自动化很有帮助。同样附一张中文版的截图:
这个工具栏还可以用来修改请求数据模拟请求发送。结合fiddler的断点功能,截取请求数据后临时修改会话入参,再发送至服务器。
步骤:
1、设置断点:rules->automatic Breakpoints->before response
2、修改入参:Inspectors->WebForms
3、修改请求变量参数后执行Run to Completion
附上一张中文版的图片更加一目了然:
3、AutoResponder[自动应答器]
允许你拦截指定规则的URL,并返回本地资源或Fiddler资源,从而代替服务器响应。
勾选‘启用规则’+规则前的勾选框,即可针对满足URL匹配规则的请求进行自动响应,响应内容可为本地文件或者要执行的行动。
匹配规则支持正则,响应内容可自定义。
附中文版截图,对照英文版本使用:
4、Composer【会话篡改器】
Composer起到的功能和Inspectors中的作用一样,都是篡改数据,不过Composer可以篡改Cookie中的数据。
也就是说,Inspectors篡改是的是我们输入的数据,例如密码输入什么就是什么。而Composer篡改的是经过处理后的,例如Cookie中的数据,其实密码已经是加密了的。
直接将抓取到的请求拖拽到Composer里,修改后再点执行即可,执行后的响应数据也可以被fiddler抓获(左侧窗口可查看)。
5、Compare【性能比较器】
前边四个工具页基本所有fiddler版本都会有,但这个好像有些版本就没有,英文名也是我瞎编的,因为我只有中文版上有,我也不知道哪个版本怎么弄出来的。
功能就是Statistics[性能统计器]加了个比较功能,可以拖拽两条url进去对比一些性能参数,或者加载两个SAZ文件进行比较,没什么太大增益。
SAZ文件:通常用于存储HTTP(S)流量供以后检查,普及范围极低。
附中文版截图:
可以看出虽然两条请求是一模一样的,但耗时还是有些差异。如果是比较安卓和IOS端大数据量的查询请求,或许可以一用。
6、Filters【过滤器】
因为Fiddler抓包是直接按照时间顺序排列出所有抓到的请求,所以难免杂乱无章,不结合过滤器的话很难去筛选有效信息。
勾选Filters开启过滤器,过滤规则挺多的,最常用的就是两个针对主机的过滤条件:Zone和Host
1、Zone 指定只显示内网(Intranet)或互联网(Internet)的内容:
2、Host 指定显示某个域名下的会话:
7、Timeline【请求响应时间】
在左侧会话窗口点击一个或多个(同时按下 Ctrl 键),Timeline 便会显示指定内容从服务端传输到客户端的时间:
三、Fiddler使用
1、报错:创建根证书不成功
解决办法:
打开cmd命令行,进入Fiddler的安装目录下。
输入命令:
makecert.exe -r -ss my -n "CN=DO_NOT_TRUST_FiddlerRoot, O=DO_NOT_TRUST, OU=Created by http://www.fiddler2.com" -sky signature -eku 1.3.6.1.5.5.7.3.1 -h 1 -cy authority -a sha1 -m 120 -b 10/12/2030
注意,最后的日期需要超过你安装软件的日期
2、如何比较两个接口请求
进行APP测试时,往往会出现Andriod和iOS端同一请求,但执行结果不同,这通常是接口请求内容差异所致。
用Fidder的 Compare 功能(快捷键 Ctrl+W)可查看差异。
- 如何配置windiff?
下载地址:https://www.grigsoft.com/download-windiff.htm
下载windiff.zip
解压压缩包windiff.zip,解压放在任意位置(建议放到fiddler安装目录下)
在Fiddler路径 Tools -> Options -> Tools 下,在File Diff Tool中选择定位到windiff.exe
- 如何使用windiff?
ctrl选中要比较的两请求
在鼠标右键菜单中找到Compare(快捷键 Ctrl+W)
在windiff中,会标识出两个请求中不同的行(红黄高亮显示为一对,表示两个请求在此行的不同内容)
3、Fiddler死活抓不了HTTPS包怎么办?
一般抓不到都是因为没配置好,踩坑多次不再赘述。此处主要标记死活抓不到的情况。
参考博文:https://blog.csdn.net/d1240673769/article/details/74298429
4、怎么使用fiddler自动处理修改Request和Response内容【难点】
手动处理修改可以通过打断点修改数据后再续发送,但一次只能处理一条响应,所以需要用到脚本结合oSession方法批量处理。
Request请求是发送给服务器的,相当于断点在请求之前,改了请求后再发送到服务器。
Response应答是从服务器返回的,发给Client客户端的内容,相当于断点在响应之前,改了响应后再发送到客户端。
修改Request和Response可在FiddlerScript中的OnBeforeRequest和OnBeforeResponse函数中添加规则即可。
OnBeforeRequest函数是在每次请求之前调用,OnBeforeResponse函数是在每次响应之前调用。
方法步骤:
(1)打开fiddler,选择Rules—customize
(2)记事本打开CustomRules.js文件
(3)查找OnBeforeRequest、OnBeforeResponse函数进行修改保存。
具体需要怎么去处理响应请求的内容需要依情况而定,举几个例子:
1)将请求的域名转发到带端口号的host上,并不改变后面的请求地址。
这个是发请求,所以要放在请求之前,故在OnBeforeRequest函数内增加
if (oSession.host.toLowerCase()== '10.20.37.58'){ oSession.host='10.23.2.70:8080'; }
做个实验:我先在FiddlerScript中加上这个判断语句:
正好使用之前Composer保存下来的Host为10.20.37.58的请求执行,可以明晰的看到左侧窗口抓到的包主机都被替换成了函数里重新赋值的10.23.2.70:8080。
2)为返回的JSON中修改一个字段的数据,并新增一个字段。
同理,修改OnBeforeResponse函数即可,不再赘述,网上借用一个例子:https://www.cnblogs.com/liumamxu/p/5118055.html
5、Fiddler 抓取Iphone / Android数据包
这可能是fiddler使用的最主要目的:抓取移动设备如手机、PAD的响应包。
简单说来就是给手机连接的wifi设置一个代理ip,这样手机通过那个wifi访问网络都会先经过代理服务器再转发到服务器,ip写电脑mac地址,端口写fiddler默认的8888。
IOS貌似需要先安装证书才可正常代理。
详细可以参考:
https://www.cnblogs.com/goal9248/articles/14280958.html
6、模拟网络极差环境,制造响应延迟等场景
曾经有客户上线新版本后,说他们营业部存在iphone11用户在大厅办理业务时出现了空指针报错,原因就是网络差导致上一个接口迟迟未响应,下一个接口入参传了个空所以直接报错了空指针。
又因为是同一时间调用了很多接口,如果你直接采取执行操作同时强制断网的形式去复现,很难踩准这个时间位置,因为还没轮到调用这两个接口,前面的接口就已经抛错网络异常了,所以最好是还原那种网络涓流的测试环境。
这样的问题虽然很难被黑白盒测试发现,但如果出现了还是需要复现问题,解决、测试然后重新上线的。
这时就可以使用fiddler来模拟这种场景:
点击工具栏 Rules → Performances → [勾选]Simulate Modem Speeds。会有一个默认限速。
我们通过修改FiddlerScript,可以修改请求或是响应网络延迟的具体数值。
点击工具栏rules - customize rules (或者ctrl+r)
ctrl+f 搜索 m_SimulateModem,便可找到限速信息,修改数值即可
if (m_SimulateModem) { // Delay sends by 300ms per KB uploaded.请求涓流延迟
oSession["request-trickle-delay"] = "300";
// Delay receives by 150ms per KB downloaded.响应涓流延迟
oSession["response-trickle-delay"] = "150"; }
通俗讲就是:每上传/下载1KB 要delay 多少毫秒。
我们知道 1s=1000ms ,如果用kbps(kb/s)去算的话,算法就是 1000/下载速度(kb/s) = 需要delay的时间(ms),比如50kb/s 需要delay 1000/50=20ms来接收数据。