前端利器躬行记(6)——Fiddler

  • 2019 年 10 月 3 日
  • 筆記

  Fiddler是一款免费的、基于Windows系统的代理服务器软件(即Web调试抓包工具),由Eric Lawrence用C#语言在2003年10月发布了第一个版本。注意,由于Fiddler依赖Microsoft .NET Framework 2.0或更高版本,因此在运行Fiddler之前需要预先将其安装。

  当启动Fiddler时,它会自动注册成Windows Internet(WinINET)网络服务代理,从而就能捕获本地所有的HTTP和HTTPS数据流。在图14中,客户端(例如Web浏览器、iOS移动设备等)会把请求交由Fiddler转发给服务器,服务器也会把响应交由Fiddler转发给客户端。在Fiddler介入后,就能实现过滤数据流、解密HTTPS、调试断点、修改请求或响应等功能。

图14  Fiddler的工作原理

一、用户界面

  Fiddler的用户界面包含6块区域:主菜单栏(1)、工具栏(2)、会话列表(3)、选项视图(4)、命令行工具QuickExec(5)和状态栏(6),如图15所示。

图15  Fiddler的用户界面

1)主菜单栏

  Fiddler的主菜单包含6部分(如下所列),几乎囊括了Fiddler的所有功能,并且利用FiddlerScript或Extensions可扩展菜单系统。

  (1)File:启动和关闭流量的捕获,加载流量文件,保存捕获的流量并支持多种格式(例如SAZ、BAT、MS等)的导出。

  (2)Edit:作用于会话列表中的会话(Session),包括复制、移除、全选、标记、搜索等操作。

  (3)Rules:由FiddlerScript文件生成的规则,包括过滤图像类会话、提供影响Web性能的选项、替换User-Agent请求首部等。

  (4)Tools:提供了控制Fiddler行为的全局配置选项、对文本进行编码和解码的TextWizard(如图16所示)、主机重映射(Host Remapping)工具(如图17所示)等。

  (5)View:视图管理器,既能刷新部分选项卡中的内容,也能重置Fiddler的用户界面,例如显示或隐藏Statistics、Inspectors等选项卡。

  (6)Help:不仅提供了多条链接,可跳转到网上论坛、在线文档等页面,还能检查是否是最新版本以及显示当前版本的基本信息。

图16  TextWizard

图17  Host Remapping

2)工具栏

  Fiddler的工具栏提供了常见命令的按钮以及预定义的快捷方式(如图18所示),例如重发请求、移除断点、保存会话、清除WinINET缓存、指示系统是否在线等。

图18  工具栏

  当把鼠标悬停在某个按钮上时,会显示一条描述其功能的提示信息,如图19所示。

图19  按钮的提示信息

3)会话列表

  Web会话记录了客户端和服务器之间的一系列交互,一个会话就是一个事务,由一条请求命令和一个响应结果组成。在Fiddler的会话列表中,每个条目代表一个会话,包含一段重要的摘要信息,如图20所示。

图20  会话列表中的摘要信息

  关于每列的描述可参考表5。

表5  列包含的信息

列名 描述
# 图标和递增的唯一ID
Result 响应状态码,例如404、302等
Protocol 协议,例如HTTP、HTTPS和FTP
Host 域名和端口号
URL 路径、文件和查询字符串
Body 响应包含的字节数
Caching 响应中的两个首部Cache-Control和Expires的值
Content-Type 响应中的Content-Type首部的值
Process 发起本次请求的本地Windows进程
Comments 通过脚本或会话列表中右键(即上下文菜单)添加的注释
Custom 通过脚本设置的文本字段

  表中的图标包括三类:会话进度、请求类型和响应类型。以图20的首末两个会话中的图标为例,第一个表示加密的HTTPS数据流,最后一个表示响应是个图像文件。

4)选项视图

   Fiddler的选项视图默认有9个选项卡(如图21所示),其中Log选项卡收集日志信息,Fiddler Orchestra Beta选项卡提供远程Web调试的功能,其余选项卡将在后文做单独讲解。

图21  默认的选项卡

5)QuickExec

  Fiddler的QuickExec允许用户快速启动脚本命令,大致分为三类:选择数据流、FiddlerScript命令和其它,表6挑选了几个常用的命令。

表6  QuickExec中的命令

命令 描述
?searchtext 搜索URL中包含指定文本的会话,搜索结果会被高亮
=status 选中指定状态码的会话
@host 选中包含指定主机的域名或IP地址的会话
cls 清空会话列表
g 恢复所有被断点暂停的会话
bpu urltext 当会话的URL包含指定文本时,会为其创建请求断点;而当没有urltext参数时,取消该断点
bpafter urltext 当会话的URL包含指定文本时,会为其创建响应断点;而当没有urltext参数时,取消该断点
!dns hostname 为目标主机执行DNS查询,在Log选项卡中显示结果
toolbar 显示工具栏

  QuickExec还提供了多组快捷键(即热键),表7挑选了几组常用的快捷键。

表7  QuickExec中的快捷键

快捷键 描述
ALT+Q 光标聚焦到QuickExec
CTRL+R 打开FiddlerScript编辑器
CTRL+E 打开TextWizard
CTRL+Down 选择下一个会话
CTRL+Up 选择上一个会话
CTRL+T 激活Inspectors的子选项卡TextView
CTRL+H 激活Inspectors的子选项卡Headers
CTRL+M 最小化Fiddler
CTRL+SHIFT+DEL 清除WinINET缓存

6)状态栏

  Fiddler的状态栏处于用户界面的最下方,显示了5项配置信息(如图22所示),从左往右的作用依次为:

图22  状态栏

(1)是否让Fiddler成为系统代理。

(2)根据选择的进程类型过滤数据流。

(3)断点影响的会话类型,包括全部请求、全部响应和无。

(4)选中的会话数和总会话数。

(5)选中会话的URL,如果选中了多个,那么只显示第一个。

二、Web调试

  Fiddler能够调试来自于桌面浏览器和移动设备的数据流。

1)代理设置

  在Windows上运行的大部分浏览器(例如IE、Chrome等),其数据流都能被Fiddler直接捕获,而其余浏览器要么需要安装插件,要么需要单独配置。

  如果要在iOS或Android设备上捕获数据流,那么首先需要配置Fiddler的Tools菜单中的Options,使其允许远程连接,注意看图23用粗线框出的选项。

图23  Fiddler允许远程连接

  然后让移动设备与Fiddler处于同一网段(例如连上相同的Wi-Fi),并修改其WLAN设置,如图24所示,其中服务器就是Fiddler所在电脑的IP地址,而端口就是Fiddler默认的工作端口号。

图24  设置代理服务器地址和端口号

2)解密HTTPS

  HTTPS是HTTP的安全版本,如果要让Fiddler将其捕获,那么需要先在Options的HTTPS选项卡中勾选“Decrypt HTTPS traffic”,允许解析HTTPS的请求和响应,如图25用粗线框出的选项。

图25  Fiddler允许解析HTTPS

  当第一次勾选时,Fiddler会生成一张自签名的证书,并且需要确认是否信任它,如图26所示。

图26  信任Fiddler证书

  在信任该证书后,就需要将其安装,如图27所示。

图27  安装Fiddler证书

  如果要让Fiddler能够捕获移动设备的HTTPS流量,那么还需要额外几步。首先打开设备的浏览器,在地址栏中输入代理服务器的IP和Fiddler的工作端口,得到下载证书的页面,如图28所示,图中用粗线框出的就是下载地址。

图28  下载Fiddler证书

  然后将下载的Fiddler证书安装到当前设备中,从而就能在Fiddler中查看到HTTPS数据流了。

3)会话数据

  在Inspectors选项卡中,请求信息在面板顶部,响应结果在面板底部,如图29所示。

图29  Inspectors选项卡

  请求和响应都包含的子选项卡如下所列。

(1)Headers:请求和响应的首部。

(2)TextView:查看文本格式的请求和响应内容。

(3)SyntaxView:查看语法高亮的请求和响应内容。

(4)HexView:以十六进制的形式显示首部和内容。

(5)Auth:请求和响应的授权和认证。

(6)Cookies:发送和接收到的Cookie信息。

(7)Raw:查看文本格式的请求和响应。

(8)JSON:将请求和响应的内容解析成JSON格式的字符串。

(9)XML:将请求和响应的内容解析成XML格式的字符串。

  其余子选项卡的作用如下所列。

(1)WebForms:解析请求的查询字符串。

(2)Transformer:设置响应内容的编码类型。

(3)ImageView:以图像形式显示响应内容。

(4)WebView:预览Web浏览器中显示的响应结果。

(5)Caching:响应的缓存信息。

4)AutoResponder

  Fiddler的AutoResponder选项卡提供了一个强大的功能,它能创建请求规则,并在匹配成功时,替换响应结果。

  在图30中,包含了一组控制AutoResponder行为的选项,只有勾选了“Enable rules”才能激活当前选项卡,在勾选“Unmatched requests passthrough”后,就能让匹配失败的请求发送到原来的服务器中,而不是返回“404 Not Found”的响应。选项卡的中心区域就是规则集合,其中第一列是匹配条件,第二列是匹配成功后所执行的动作。

图30  行为选项和规则集合

  图31是编辑规则的区域,第一个可写的选择框用于定义规则(即匹配条件),第二个用来指定重定向的本地文件、延迟返回响应结果等各类行为。

图31  编辑规则

  每个匹配条件都会包含一个前缀,可供选择的前缀有NOT、EXACT和REGEX。其中NOT会忽略给定字符串的请求,EXACT会精确匹配给定字符串,REGEX会指定一段正则表达式,通过.NET正则表达式引擎来匹配。

5)发送请求

  Fiddler的Composer选项卡(如图32所示)支持发送一条或多条请求,它能编辑请求的方法、首部、内容和URL等部分,其中URL需要包含http://、https://等协议,不仅如此,还能上传文件。

图32  Composer选项卡

6)过滤流量

  Fiddler的Filters选项卡提供了7组过滤选项,包括主机、客户端进程、请求首部、断点、响应状态码、响应类型和大小以及响应首部,如图33所示。

图33  Filters选项卡

  Filters选项卡可用来修改Cookie、模拟跨域、过滤二级域名的会话、捕获远程进程等。

7)设置断点

  Fiddler包含两种断点,分别是请求断点和响应断点。它们中断的时刻不同,前者是请求已发送,但还未到服务器;后者是响应已返回,但还未到客户端。

  在图34中,用粗线框出的“Before Requests”和“After Responses”可分别设置全局的请求断点和响应断点,利用Filters和AutoResponder可过滤掉无用的会话,从而能更精确地定位断点。

图34  设置断点

  当执行断点时,可在Inspectors中编辑请求或响应(例如修改URL、首部、内容、查询字符串等),并且所做的变更会被自动提交。而在Inspectors的中间位置(即请求和响应之间)还会出现一个断点栏,如图35所示,包含两个按钮和一个选择框。

图35  断点栏

  第一个“Break on Response”按钮会为当前会话设置响应断点;第二个“Run to Completion”按钮会继续执行会话并且不再设置断点;选择框用来配置响应结果,提供了多套特定模板以及上传文件的入口。

  如果在QuickExec中输入g命令后,那么就会移除所有断点,恢复会话的执行。

三、性能测试

  在Fiddler中,不仅能清晰的看到页面权重、缓存信息、压缩情况等数据,还能配置各种规则来隔离性能瓶颈。

1)分析会话性能

  在Statistics选项卡中,记录了处理会话所花费的各项参数的时间,而利用这些数据就可以分析出会话的性能问题,表8列出了各个性能参数的具体说明。

表8  性能参数

参数名 描述
Request Count 选中的会话数
Bytes Sent 发送的字节数
Bytes Received 接收的字节数
ClientConnected 客户端第一次和Fiddler建立连接的时间
ClientBeginRequest 客户端开始向Fiddler发送请求的时间
GotRequestHeaders Fiddler从客户端接收完请求首部的时间
ClientDoneRequest Fiddler从客户端接收完整个请求的时间
Determine Gateway 确定使用哪个网关代理所花费的毫秒数
DNS Lookup 解析DNS所花费的毫秒数。由于DNS存在缓存,因此除了第一次,其余时候该值都是0
TCP/IP Connect 建立TCP/IP连接所花费的毫秒数
HTTPS Handshake 在HTTPS握手中所花费的毫秒数
ServerConnected 和服务器或上游网关代理建立TCP/IP连接的时间
FiddlerBeginRequest Fiddler开始向服务器发送请求的时间
ServerGotRequest Fiddler向服务器发送完请求的时间
ServerBeginResponse Fiddler接收服务器响应的第一个字节的时间
GotResponseHeaders Fiddler从服务器接收完响应首部的时间
ServerDoneResponse Fiddler从服务器接收完整个响应的时间
ClientBeginResponse Fiddler开始向客户端发送响应的时间
ClientDoneResponse Fiddler向客户端发送完响应的时间
Overall Elapsed 花费的总时间
Estimated Worldwide Performance 在不同的地区和连接方式下所花费的时间,注意,由于实际网络会受很多因素的影响,因此该估值可能不准确

  点击下方的“Show Chart”会出现一张饼图,其切片是各个MIME类型以及数据流首部的字节数,如图36所示。

图36  字节饼图

2)分析瀑布图

  选中一个或多个会话后,可在Timeline选项卡中看到数据流的瀑布图,如图37所示。

图37  瀑布图

  默认采用时间轴模式,即横轴表示时间,纵轴表示文件名,线条栏表示会话。当鼠标悬在线条栏上时,在下方的状态栏会显示该会话的更多信息。

  条形栏会在ClientBeginRequest时刻开始绘制,然后在ClientDoneResponse时刻结束绘制。条形栏会根据响应的MIME类型着色,其中亮绿色是图像、军绿色是JavaScript、紫色是CSS、蓝色是其它文件。条形栏中的黑色竖线表示ServerBeginResponse的时间。

  条形栏前面有两个圆圈,上方表示客户端与Fiddler之间的连接,下方表示Fiddler与服务器之间的连接,而它们都包含两种颜色,绿色表示复用连接,红色表示新建连接。条形栏后面的红色X图标表示服务器返回的响应首部中包含“Connection:close”,会阻止后续请求复用该连接。

3)模拟HTTP压缩

  HTTP规范提供了两种提高性能的编码方式:压缩(Compression)和分块传输编码(Chunked Transfer-Encoding),而在Inspectors选项卡的Transformer中可以设置这两种编码方式,如图38所示。

图38  默认的Transformer

  Fiddler提供了4种压缩算法:GZIP、DEFLATE、BZIP2和Brotli。每当选中某个算法或复选框时,“Response Body”的字节数就会改变,有时在“HTTP Compression”的下方还会有简短的信息提示,从而就能对比使用Transformer前后的差异。图39和图38应用的是同一个响应,在选中GZIP压缩算法后,响应内容的字节数明显降低了很多。

图39  选中GZIP压缩算法后的Transformer

四、扩展

  Fiddler提供了多样化的扩展模型,包括FiddlerScript、.NET开发、FiddlerCore以及第三方插件。

1)FiddlerScript

  FiddlerScript既能扩展Fiddler的菜单(例如Tools、Rules等),也能过滤或修改会话。Fiddler在处理每个会话时,都会执行CustomRules.js中的方法,而在FiddlerScript选项卡中能编辑该脚本文件,如图40所示。

图40  FiddlerScript选项卡

  Fiddler在上图的Handlers类中保留了多个静态函数(例如OnPeekAtResponseHeaders、OnBeforeResponse等),它的参数就是当前会话,可以在其内添加自定义的逻辑。Fiddler还提供了多个工具函数和属性,用来完成一些常见任务,例如在状态栏上设置文本,播放音频文件等。

2).NET扩展Fiddler

  在Fiddler中,还可以通过.NET框架支持的语言(例如C#、VB.NET等)来进行扩展。.NET构建的扩展无需修改FiddlerScript中的脚本文件,只要安装到电脑中就能使用,并且在控制面板中就能卸载。

  由于FiddlerScript构建的扩展,在Fiddler启动时需要重新编译,而.NET构建的扩展并不会这样,因此后者的加载速度和运行时性能都要好很多,但与此同时,其开发复杂度也会上升很多。

3)FiddlerCore

  FiddlerCore是一个.NET类库,可以集成到.NET应用程序中,只提供了Fiddler的代理功能,可用来捕获、过滤或修改HTTP和HTTPS流量,而不必借助Fiddler UI,像自动化测试这类情况就很适合使用FiddlerCore。在图41中,左边是包含扩展的Fiddler应用,右边是集成FiddlerCore的用户应用。

图41  Fiddler.exe VS YourApp.exe

4)功能插件

  Fiddler官方和独立开发者们提供了丰富的功能插件(即附加组件),可大大提升Fiddler的可用性和测试性,在下面的地址中列出了部分扩展。接下来会通过一个例子来说明Fiddler插件的用法。

https://www.telerik.com/fiddler/add-ons

  目前很多网站都会对自己的JavaScript文件进行压缩(如图42所示),如果要在Fiddler中查看这类脚本,那么就得使用JavaScript Formatter插件,它能将压缩代码格式化,使之可读。

 图42  压缩后的脚本

  首先从官网上下载它的安装包,安装成功后再重启Fiddler,然后在会话列表中右击想要查看的JavaScript文件,得到图43所示的上下文菜单,选择用粗线框出的选项。 

图43  Make JavaScript Pretty

  此时在SyntaxView选项卡中就能查看到美化后的脚本了,如图44所示。

图44  美化后的脚本