Fiddler WEB

Fiddler WEB

  1. Fiddler是一款专业、免费的Web应用调试工具。通过内置的代理功能,Fiddler可以同时支持浏览器网页、手机App分析。用户安装Fiddler提供的根证书,还可以解密HTTPS加密数据。
  2. Fiddler是一个HTTP的调试代理工具,它内置了基于Windows系统的专用代理服务器,能够记录并检查所有计算机和互联网的HTTP通信。通过设置断点,用户还可以修改所有“进出”Fiddler的数据。
  3. Fiddler作为一种代理服务器软件,其核心功能就是作为代理服务器。代理也称为网络代理,是一种特殊的网络服务。它允许一个网络终端(一般为客户端)通过这个服务器与另一个网络终端(一般为服务器)进行非直接连接。而提供代理服务的电脑系统或其他类型的网络终端称为代理服务器。
  4. 下载Fiddler,访问网址http://getfiddler.com,可以跳转到Fiddler的官方下载页面。页面中有3个文本框需要用户填写。填写完以后,需要勾选I accept the Fiddler End User License Agreement前面的复选框,然后单击Download for Windows按钮就可以下载了。建议使用默认的文件夹作为安装路径。因为有些Fiddler组件需要安装在默认路径下,否则这些组件将无法正常安装。
  5. 我们要使用Fiddler来捕获客户端浏览网页或网站的数据,就需要把Fiddler设置为代理服务器。成为代理服务器后,Fiddler可以捕获本机的会话,也可以捕获到局域网内其他主机的会话,还可以捕获到手机上的会话。
  6. 捕获本机数据
    1. 启动Fiddler后,Fiddler默认作为系统代理服务器。其中,状态栏最左边显示Capturing,说明Fiddler已经作为系统代理服务器了。这时,在浏览器中访问网站,所有请求和响应的会话就会在Web Sessions列表中显示。
    2. 不断访问网站,产生的所有会话也都会出现在Web Sessions列表中。如果不想让会话出现在Web Sessions列表中,可以取消Fiddler的代理服务器功能。取消方法是,在菜单栏中选择File|Capture Traffic命令,或者单击状态栏中的Capturing。
    3. 设置好后,在状态栏中就不会显示Capturing了。这时,访问任何网站都不会捕获到会话,后续的会话也就不会出现在Web Sessions列表中。
  7. 捕获手机数据
    1. 当安装Fiddler的主机和手机在同一个局域网中时,Fiddler可以捕获到手机浏览网站的数据。
    2. 设置Fiddler所在的主机,启动Fiddler。在菜单栏中,选择Tools| Options…命令,弹出Options对话框,切换到Connections选项卡。勾选Allow remote computers to connect复选框,弹出警告对话框。允许远程客户端连接Fiddler,需要重新启动Fiddler才生效。单击“确定”按钮,返回到Connections选项卡。默认监听端口为8888,设置好以后,单击OK按钮,Fiddler需要重新启动。
    3. 设置手机的局域网代理,查看手机所连无线网的网络详情,设置手机的无线网络代理。其中,手机的IP地址为12.103。该地址和Fiddler所在的主机在同一局域网内。这时,手机没有设置代理。单击代理下的文本框,选择手动代理,设置代理配置。在代理服务器主机名区域输入Fiddler所在主机的IP地址12.100,在代理服务器端口输入8888。
  8. 设置其他主机代理
    1. 在其他主机的浏览器中,依次选择“设置”|“Internet选项”命令,弹出“Internet选项”对话框,切换到“连接”选项卡。单击下方的“局域网设置”按钮,弹出“局域网(LAN)设置”对话框。勾选“代理服务器”下面的复选框。在“地址”文本框中输入Fiddler所在主机的IP地址。在“端口”文本框中输入端口号8888。
  9. 捕获本地数据
    1. 本地数据是指经过本地虚拟接口的数据。该接口对应的地址被称为本地地址或回环地址(Loopback Address),通常使用localhost或127.0.0.1表示该地址。在使用Fiddler捕获数据时,有可能无法捕获到本地数据。这时,可以通过以下两种方式进行捕获。使用主机名,通常情况下,使用http://localhosthttp://127.0.0.1来访问本地主机。如果Fiddler无法捕获到本地数据,需要使用主机名进行访问。Fiddler格式地址指的是在本机IP地址后面直接加上.fiddler。在访问本地主机时,它的基本格式如下:http://ip.fiddler:port
  10. 验证捕获数据
    1. 开启Fiddler后,默认情况下将会捕获所有应用程序的数据。为了验证是否捕获指定应用的数据,可以开启代理认证来验证。开启代理认证,依次选择Rules|Require Proxy Authentication命令。此时,当应用程序再次产生数据包时,Fiddler捕获到的数据包为访问被拒绝的数据包。这里使用IE浏览器访问网站。由于开启了代理认证,通过IE浏览器将无法直接访问网站。这时会弹出认证信息的对话框。Fiddler代理默认的用户名和密码都为1。在对应的文本框中输入用户名密码后,单击“确定”按钮,就可以成功访问到网站了。此时Fiddler可以捕获到对应的数据包了。
  11. 使用上游代理
    1. 部分网络为了安全,访问网站必须使用代理服务器,否则无法连接。此时的访问流程为客户端>Fiddler>代理服务器>目标网站。在这个访问过程中,Fiddler是客户端的代理,而代理服务器是Fiddler的代理,也被称为Fiddler的上游代理。在这种网络环境中,Fiddler还需要设置上游代理。在菜单栏中,依次选择Tools|Options…命令,弹出Options对话框,切换到Gateway选项卡。复选框的具体含义:Use System Proxy(recommended)使用系统代理;Automatically Detect Proxy using WPAD使用WPAD机制,自动发现网络内的代理服务器;Manual Proxy Configuration手动设置代理;No Proxy不使用代理。
    2. 如果需要使用上游代理,根据自己的需要勾选对应的复选框即可。例如,使用手动设置代理,需要自己输入代理信息。此时,需要在两个文本框中输入对应的信息。输入代理服务器的地址和端口号,格式为“地址:端口号”。如果不指定端口号,默认使用80端口Proxy string:http=CorpProxy:80;https=SecureProxy:80;ftp=ftpGW:80、免代理列表,可以将不需要使用代理的网址输入该文本框中。每个网址之间使用分号分隔Bypass list <locla>;*.extranet.example.com;
  12. 常见问题
    1. 按照以上方法设置代理后,有时Fiddler还是无法抓取到其他计算机/手机的会话。这往往是由于Fiddler所在主机的防火墙导致Fiddler代理失败。
    2. 检查端口监听,在命令行中执行netstat命令,检查端口监听情况。
    3. 设置防火墙例外程序,通过“开始”菜单,打开“控制面板”窗口。单击“Windows防火墙”选项,打开“Windows防护墙”窗口。单击“允许程序或功能通过Windows防火墙”选项,打开“允许的程序”窗口。单击“允许运行另一个程序”按钮,弹出“添加程序”对话框。选择要添加的Fiddler 4程序,然后单击“添加”按钮,将Fiddler 4添加到允许的程序列表中。
    4. 设置防火墙端口8888例外,在“Windows防火墙”窗口中,单击“高级设置”选项,打开“高级安全Windows防火墙”窗口。在左侧栏中,单击“入站规则”选项,显示“入站规则”面板。单击“新建规则”选项,弹出“新建入站规则向导”对话框。选择“端口”单选按钮,单击“下一步”按钮,进入“协议和端口”对话框。选择“特定本地端口”单选按钮,并在文本框中输入允许通过的端口8888。单击“下一步”按钮,进入“操作”对话框。单击“下一步”按钮,进入“配置文件”对话框。使用默认的配置,单击“下一步”按钮,进入“名称”对话框。在“名称”文本框中输入规则名称。例如,这里设置的名称为“8888代理”。单击“完成”按钮,回到“高级安全Windows防火墙”窗口。这时,可以看到添加的入站规则。
  13. 配置HTTPS解密
    1. Fiddler在捕获网站数据时,默认只捕获HTTP数据。但是很多网站为了安全,会对数据进行加密,使用HTTPS进行传输。为了能够捕获和解析HTTPS的数据,用户需要进行相关设置。
    2. 启用HTTPS解密
      1. 为了能够捕获到加密的会话,需要设置Fiddler捕获HTTPS会话连接,并启用HTTPS解密功能。用户需要单击Tools|Options…命令,打开Options对话框。单击HTTPS标签,打开HTTPS选项卡。
      2. 启用HTTPS解密功能需要捕获到该协议的数据包。在HTTPS选项卡中,需要先勾选Capture HTTPS CONNECTs复选框,捕获HTTPS会话连接。然后再勾选Decrypt HTTPS traffic复选框,开启HTTPS解密功能。
      3. 设置数据来源,Fiddler会捕获所在主机上所有进程的HTTPS数据包。如果使用HTTPS的进程很多,那么会获取太多的无用会话。为了能够捕获特定类型的HTTPS数据包,需要设置要捕获数据的来源。在HTTPS选项卡中,单击from all processes下拉按钮,弹出下拉列表框。Fiddler将HTTPS数据来源分为4种,每种来源说明如下:…from all processes捕获所有进程的HTTPS包;…from browsers only只捕获浏览器产生的HTTPS包;…from non-browsers only:只捕获非浏览器产生的HTTPS包;…from remote clients only:只捕获远程客户端产生的HTTPS包。
      4. 设置客户端加密类型,HTTPS的版本不同,采用的加密方式也会不同。如果明确了加密类型,在捕获加密的HTTPS数据包时,可以指定客户端使用的加密类型。Fiddler支持的类型有ssl2、ssl3、tls1.0、tls1.1和tls1.3。客户端加密类型默认使用的是ssl3和tls1.0。设置客户端加密类型,需要在HTTPS选项卡中单击<client>;ssl3;tls1.0链接,弹出HTTPS Protocols对话框,然后在文本框中输入要设置的客户端加密类型即可。
      5. 解密/跳过特定主机,在捕获过程中,如果某些主机的HTTPS数据包不需要进行解密则可以直接跳过。在HTTPS选项卡中,Skip decryption for the following hosts下面的文本框中输入要跳过解密的主机地址即可。
      6. 如果只对特定主机的HTTPS数据包进行解密,需要在HTTPS选项卡中单击Skip decryption链接,然后在Perform decryption only for the following hosts下面的文本框中输入进行解密的主机地址即可。
    3. 导出证书
      1. Fiddler提供了导出证书的功能。导出的证书可以供其他计算机和手机使用,便于后期解密。导出证书时,需要在HTTPS选项卡中单击Actions按钮,弹出下拉列表框。在其中选择Export Root Certificate to Desktop选项,弹出Success对话框。该对话框提示已经成功将证书导出到了桌面,证书名称为FiddlerRoot.cer。
      2. 要解密HTTPS的数据,必须安装Fiddler的证书。Fiddler所在的计算机上已经安装了该证书。非Fiddler所在的计算机就需要用户手动将证书导入了。这里以Windows7系统的计算机为例,讲解如何导入证书。使用Win+R快捷键,打开“运行”对话框,输入mmc。单击“确定”按钮,打开控制台。选择“文件”|“添加/删除管理单元”命令,弹出“添加或删除管理单元”对话框。在左侧栏中找到“证书”,单击“添加”按钮,弹出“证书管理”对话框。需要选择要管理的证书账户。这里选择“计算机账户”单选按钮,单击“下一步”按钮,弹出“选择计算机”对话框。这里使用默认值。单击“完成”按钮,可以看到成功将证书添加到了右侧的管理单元中。单击“确定”按钮,关闭该对话框,返回到控制台。在左侧可以看到相关信息。在左侧栏中,展开“证书”分支。在“受信任的根证书颁发机构”中找到“证书”。右击“证书”选项,依次选择“所有任务”|“导入”命令,弹出“证书导入向导”对话框。单击“下一步”按钮,弹出“要导入的文件”对话框。单击“浏览”按钮,选择要导入证书的路径。这里导入桌面上的证书Fiddler-Root.cer,单击“下一步”按钮,弹出“证书存储”对话框。选择证书的存储位置。这里使用自动存储。选择“根据证书类型,自动选择证书存储”单选按钮,单击“下一步”按钮,弹出“正在完成证书导入向导”对话框。单击“完成”按钮,完成证书导入,弹出“导入成功”对话框。“导入成功”对话框。
      3. 在手机上导入证书,如果要解析手机上的HTTPS会话,需要在手机上导入Fiddler的证书。下面是操作方法。将要安装的证书复制到手机SD卡的根目录下。打开手机的“设置”界面。在“设置”界面中找到“安全”选项,打开“安全”界面。由于证书放在了SD卡的根目录下,因此选择从SD卡进行导入安装。这里选择“从手机U盘和SD卡安装”选项,弹出“为证书命名”对话框。将证书命名为FiddlerCA。然后单击“确定”按钮,弹出“注意”对话框。在手机上安装证书,需要输入手机设置的密码。单击“确定”按钮,正确输入密码后,证书在手机上安装成功。返回“安全”界面,打开“受信任的凭据”界面,可以看到安装成功的证书。
  14. 保存数据
    1. Fiddler会捕获到大量的会话数据。对于重要的会话,用户往往需要保存,以便日后使用,或使用其他软件进行分析。
    2. 保存档案数据
      1. 档案格式是Fiddler的特有格式,后缀名是.saz(Session Archive Zip的缩写)。档案格式用于保存HTTP会话信息。使用该格式,用户可以保存全部会话数据,也可以保存指定的会话。
      2. 保存所有会话数据,如果Fiddler捕获到的数据包全部有用,可以将这些数据包全部保存。操作方法如下:将所有的会话数据保存到一个文件中。在菜单栏中,依次选择Save|All Sessions…命令,弹出Save Session Archive对话框。选择会话保存的路径,并在“文件名”文本框中输入保存文件的名称,文件的后缀名默认为.saz。单击“保存”按钮,完成保存操作。
      3. 保存指定数据包,如果只想保存部分重要的会话,可以先选择对应的数据包,然后再进行保存。保存指定的数据包。在菜单栏中,依次选择Save|Selected Sessions|in ArchiveZip…命令,然后选择保存路径即可。
    3. 打开档案数据
      1. 将会话数据保存到档案文件后,如果想使用这些数据,则可以进行加载。对于以前打开过的文件,Fiddler还提供了历史记录功能,用于快速打开这些文件。加载档案文件,并查看历史记录。在菜单栏中,依次选择File|Load Archives…命令,弹出Load Session Archives对话框。选择要加载的档案文件,这里加载的是sessions.saz文件。单击“打开”按钮,即可成功加载。从图中可以看到成功加载了7个数据包。查看最近加载档案文件的记录。在菜单栏中,依次选择File| Recent Archives…命令。从图中可以看到刚才加载sessions.saz文件的记录信息,并且编号为0。
    4. 保存为其他文件格式
      1. Fiddler允许将捕获到的数据包保存为其他格式文件的数据,供第三方软件使用。同时,它也可以导入第三方软件保存的文件数据。
      2. 保存为第三方软件支持的文件格式,Fiddler提供了8种第三方软件支持的文件格式,保存方法如下:现捕获到10个数据包。在菜单栏中,依次选择File|Exprot Sessions|All Sessions…命令,弹出Select Export Format对话框。单击下拉按钮,在下拉列表框中将显示支持的导出格式。将数据包保存为基于JSON的HTTP存档格式的文件。选择HTTPArchive v1.1,然后单击Next,弹出Export As HTTPArchive v1.1对话框。将保存的文件命名为keep-json,后缀名为.har。显示了支持的8种导出格式,每种格式说明如下:
        1. cURL Script:cURL格式,可以用于通过URL语法进行文件传输的命令行工具。
        2. HTML5 AppCache Manifest:HTML 5缓存清单列表格式,可以用于离线应用程序下载资源。
        3. HTTPArchive v1.1:基于JSON的HTTP存档格式。
        4. HTTPArchive v1.2:基于JSON的HTTP存档格式。
        5. MeddlerScript:Meddler脚本格式。Meddler是一个基于JavaScript的HTTP/HTTPS生成工具。
        6. Raw Files:将所有内容保存到文件夹中。
        7. Visual Studio WebTest:XML WebTest文件格式,由Microsoft Visual Studio WebTest 2010+支持。
        8. WCAT Script:WCAT request-replay脚本,可以由Microsoft的Web容量分析工具加载。
      3. 导入第三方格式的文件,不同软件保存文件的格式往往不同,Fiddler提供了导入文件功能,可以打开第三方软件保存的文件。Fiddler支持5种格式文件的导入。现有一个Wireshark软件捕获到的test.zip.pcapng数据包文件。打开该文件。图中显示了4个HTTP数据包。其中,编号为4和31的数据包为请求包,编号为28和32的数据包为响应包。启动Fiddler。此时,没有一个会话。将Wireshark软件的.pcapng文件导入到Fiddler中。在Fiddler菜单栏中,依次选择File|Import Sessions…命令,弹出Select Import Format对话框。单击下拉列表框,显示的支持导入的文件格式。选择Packet Capture选项,单击Next按钮,弹出Import from Packet Capture对话框。选择要导入的test.zip.pcapng文件,单击“打开”按钮,将成功导入数据包。这时可以看到两个会话,每个会话包含一个HTTP请求和响应。Fiddler支持5种导入格式,每种格式说明如下:
        1. Folder Tree:从目标文件夹及其子文件夹加载所有的SAZ文件。
        2. HTTPArchive:加载基于JSON格式的HTTP存档文件。
        3. IE’s F12 NetXML:加载Internet Explorer F12开发工具导出的XML格式文件。
        4. Packet Capture:导入Wireshark、Microsoft Network Monitor和Message Analyzer等工具捕获的HTTP的数据包文件。
        5. TestStudio LoadTest:从Telerik Test Studio(自动化工具)中读取HTTP/HTTPS数据包。

Session

  1. 在Fiddler中,抓取的数据都以Session的形式存在。每个Session都保存着客户端和服务器完整的数据请求和响应。为了便于用户快速获取会话信息,Fiddler提供了Session摘要信息和统计信息功能。
  2. Web Session列表是Fiddler中最重要的部分。它显示了Fiddler捕获的每个Session的简短摘要信息。在Web Session列表中,一个条目就是一个Session。下面先初步认识Web Session列表的基本信息。启动Fiddler捕获数据,查看Web Session列表中包含的重要信息。Web Session列表中可以看到一些列标题,每一列标题包含会话的一些重要信息。每一列的具体含义如下:
    1. #表示Fiddler为Session生成的ID。
    2. Result表示响应状态码。
    3. Protocol表示该Session使用的协议,如HTTP、HTTPS、FTP。
    4. Host表示接收请求的服务器的主机名和端口号。
    5. URL表示请求URL的路径、文件和查询字符串。
    6. Body表示响应体中包含的字节数。
    7. Caching表示响应头中Expires和Cache-Control字段的值。
    8. Content-Type表示响应的Content-Type头类型。
    9. Process表示数据流对应的本地Windows进程。
    10. Comments表示Session的注释信息。
    11. Custom表示FiddlerScript设置的ui-CustomColumn标志位的值。
  3. Session的摘要信息,每个Session的摘要信息在Web Session列表中以列标题的形式列举出来。
    1. 会话编号
      1. 在一次抓包中,Fiddler往往会抓取大量的会话。为了区别这些会话,Fiddler会为每个会话添加会话编号。窗口中的第一列#,就是Fiddler为Session生成的ID。它以数字的形式来区分每个Session。
      2. 实际情况下,Fiddler捕获的会话较多,生成的ID也会逐渐变大。默认情况下,Web Session列表中的会话不会自动滚动到最后捕获的会话位置。
      3. 排序查看我们可以对#列进行排序,来查找最后一个Session。单击#列后,Session的ID就会由大到小进行排列,即从249排到1。排序后,第249个Session就是最后捕获的会话。
      4. 搜索查看,在捕获到的Session中,我们也可以对该列生成的ID进行查找,快速定位到自己想要的Session。右击#列标题,在弹出的快捷菜单中选择Search this column…命令,弹出Search #对话框。在对话框中输入235,单击OK按钮,则自动选中编号为235的会话。
    2. 响应状态码
      1. 响应状态码是客户端和服务器之间交流信息的语言,Web服务器通过它来告诉客户端发生了什么事。在Fiddler中,第二列显示为每个会话的响应状态码。用户可以根据响应状态码判断出客户端与服务器之间的各种情况。Fiddler捕获到的会话很多,对应的响应状态码也不尽相同。HTTP状态码(HTTP Status Code)用3位数字代码表示网页服务器HTTP的响应状态。所有状态码的第一个数字代表了响应的5种状态之一。它是最快、最有效获取网站信息的方法。常见的状态码有如下几个:200表示服务器成功返回网页、404请求的网页不存在、503服务器不可用。
      2. 搜索状态码查找Session,通过搜索该状态码,可以快速找到请求失败的会话。右击Result列标题,在弹出的菜单中选择Search this column…命令,弹出Search Result对话框。在文本框中输入404,单击OK按钮,Fiddler会自动标识出所有状态码为404的会话。
      3. 隐藏状态码304的Session,状态码304是指自从上次请求后,请求的网页未修改过。服务器返回此响应时,不会返回网页内容。正是由于不会返回网页内容,所以状态码304的会话可以不用分析。这时,可以把状态码304的会话隐藏,减少会话量,以便于更好地分析其他会话。在菜单栏中,依次选择Rules|Hide 304s命令。在浏览器中,继续浏览访问过的网页。这时,捕获到的会话就包含状态码为304的会话了。用户也可以通过搜索状态码功能,验证捕获到的会话是否包含状态码304的会话。状态码304的会话被隐藏后,搜索结果没有任何反应。
    3. 会话协议
      1. Fiddler捕获的会话协议是客户端和服务器之间数据传输的沟通方式。在Fiddler中,第三列Protocol表示客户端和服务器之间使用的网络协议。在访问网站时,默认捕获会话的协议为HTTP。协议只有HTTP,默认不会捕获其他协议的会话。如果想要捕获FTP协议的会话,需要手动配置Fiddler,方法如下:
      2. 在菜单栏中,依次选择Tools|Fiddler Options…命令,弹出Options对话框。单击Connections标签,切换到Connections选项卡。在打开的Connections选项卡中,勾选Capture FTP requests复选框。单击OK按钮。访问FTP服务器,查看捕获的会话协议。
    4. 服务器主机
      1. Fiddler捕获到的每一个会话都有对应的主机名。每个主机名都代表客户端请求的一个服务器。用户访问网站时,往往会请求多个服务器,这时主机名就会不同。Fiddler捕获到会话的主机名比较多,用户可以通过搜索功能找到相应的会话。也可以拖曳列标题查看完整的主机名。
      2. 搜索查看主机名的相关会话,当捕获到的Session较多时,很难快速找到客户端请求服务器的主机名。用户可以通过搜索主机名的方式,快速检索到客户端请求特定服务器的所有会话。下面快速找到主机包含qq.com的所有Session:右击Host列标题,在弹出的快捷菜单中选择Search this column…命令,弹出Search Host对话框。在文本框中输入qq.com,单击OK按钮,弹出的窗口。
      3. 拖曳列标题查看完整的主机名,在捕获到的会话中,有的主机名比较长,无法完整显示。这时,可以通过改变列标题的宽度,查看完整的主机名,方法如下:把光标移动到列标题的右侧,然后拖动标题分割线,改变列标题的宽度,较长的主机名就可以完整显示了。
    5. 统一资源定位符
      1. URL(Uniform Resource Locator,统一资源定位符)是对互联网上资源的位置和访问方法的一种简洁的表示,也被称为互联网上标准资源的地址。在Fiddler中,第5列URL就是互联网上的资源地址。每个会话都有一个URL。
      2. 搜索、查看URL的相关会话,在捕获到的Session中,用户可以对该列的URL字符串进行查找,以便快速定位到对应的所有会话。例如,查找URL包含baidu.com的所有Session,方法如下:右击URL列标题,在弹出的快捷菜单中选择Search this column…命令,弹出Search URL对话框。在文本框中输入baidu.com,单击OK按钮。包含baidu.com的会话都会被标注。
      3. 复制URL进行查看,当捕获到的会话URL比较长时,无法通过拖曳列标题的方法查看完整的URL。这时,可以通过Copy的方法把URL复制出来,然后粘贴到其他地方查看。选中要复制的URL会话,右击该会话,依次选择Copy|Just Url命令,将URL复制到剪贴板中,然后粘贴到其他编辑器中,就可以看到完整的URL了。这里将会话的URL粘贴到记事本中。
    6. 注释会话
      1. 注释会话是对会话进行注释标记,以方便查找。默认情况下,Fiddler捕获的会话没有任何注释信息。选中会话后,用户可以通过单击工具栏中的按钮,在弹出的对话框中输入注释信息。这样就可以对会话添加注释标记了。当注释会话比较多时,也不容易直接找到。这时,可以通过搜索功能查找注释的会话。
      2. 搜索注释会话,当捕获到的会话注释很多时,用户也可以对该列进行查找。下面搜索注释信息包含“百度”的会话。右击Comments列标题,在弹出的快捷菜单中选择Search this column…命令,弹出Search Comments对话框。在文本框中输入“百度”,单击OK按钮。
      3. 拖曳列标题查看完整的会话注释信息,有的会话的注释信息比较多,需要改变列标题的宽度才可以看到完整的主机名。把光标移动到列标题的右侧,然后拖曳列标题分隔符,改变列标题的宽度,就可以看到较长的注释信息了。
    7. 会话进程
      1. 进程是系统进行资源分配和调度的基本单位,是操作系统结构的基础。Fiddler的Process列记录了数据流对应的本地Windows进程。通过查看该列,用户可以知道会话对应的进程。从Process列可以看到,会话对应的进程是不同的,代表分别用不同的浏览器来访问网站。
      2. 用户还可以根据进程类型过滤会话。在状态栏中,单击第二个选项,弹出过滤选项。Fiddler提供了4种过滤方式,每种方式的说明如下:All Processes捕获所有进程的会话;Web Browsers只捕获Web浏览器产生的会话;Non-Browser捕获非浏览器产生的会话;Hide All不捕获会话。
      3. 例如,选择Non-Browser选项,Fiddler将捕获非浏览器产生的会话,而不会捕获浏览器产生的会话。这时使用浏览器访问优酷网站,不会增加新的会话;但是,如果使用优酷App,则会增加新的会话。
    8. 隐藏摘要信息
      1. 对于Session的一些摘要信息,用户可以对其进行隐藏。这里以隐藏URL列标题为例。右击URL列标题,在弹出的快捷菜单中,选择Hide this column命令。Web Session列表不再显示URL列标题了,说明URL列已被成功隐藏。如果想恢复被隐藏的列标题,方法如下:右击未隐藏的列标题,在弹出的快捷菜单中选择Ensure all columns are visible命令,就可以把隐藏的列标题显示出来了。
  4. Session统计信息
    1. Session的统计信息是对Fiddler捕获的会话进行总结统计,用来显示当前会话的基本信息。用户可以对一个会话进行统计,也可以对多个会话进行统计。
    2. 单一会话统计信息,用户可以通过Fiddler中的Statistics选项卡,查看选中的Session统计信息,了解其基本信息。选中一个会话,单击右侧的Statistics选项卡,查看单个会话的统计信息。可以看到选中的Session的统计信息内容。主要信息说明如下:
      1. Request Count:选中的Session数目。
      2. Bytes Sent:HTTP请求向外发送的字节数。
      3. Bytes Received:HTTP请求接收到的所有字节数。
      4. DNS Lookup:所有选中的Session解析DNS所花费的时间总和。
      5. TCP/IP Connect:所有选中的Session建立TCP/IP连接所花费的时间总和。
      6. HTTPS Handshake:所有选中的Session在HTTPS握手上所花费的时间总和。
      7. RESPONSE BYTES(by Content-Type):选中的Session中各个Content-Type的字节数。
      8. 在Statistics选项卡的下方是个饼图,默认情况下不显示。单击Show Chart按钮后,就会显示选中的Session的饼图。该饼图显示为会话内容构成和占比。从饼图中可以看到,选中的Session的MIME类型为HTML。单击饼图上面的Collapse Chart链接,可以再次隐藏该饼图。
    3. 多个会话统计信息,要想统计多个会话,需要先选中它们。根据会话是否连续,选中会话的方式分为连续选中和不连续选中。
      1. 选中不连续的会话,先选中其中一个会话,然后按住Ctrl键,再单击想要选中的Session。
      2. 选中连续的会话,要选中连续的会话,先选中第一个会话,然后按住Shift键,再选中连续会话中的最后一个会话。
      3. 同时选中连续与不连续的会话,如果要选择的会话包含以上两种情况,就需要先选中连续的会话,然后选中不连续的会话。
      4. 多个Session的统计,选中多个会话,单击右侧的Statistics选项卡,查看多个Session的统计信息。
    4. 多个Session的统计信息与单个Session的统计信息内容有些不同。主要内容说明如下:
      1. Unique Hosts:流量流向的独立目标主机数。
      2. Requests started at:接收到第一个请求的第一个字节的时间点。
      3. Responses completed at:发送到客户端的最后一个响应的最后一个字节的时间点。
      4. Aggregate session duration:所有选中的Session从请求到响应花费的时间总和。
      5. RESPONSE CODES:选中Session中各个HTTP响应码的计数。
      6. REQUESTS PER HOST:每个主机的请求数。
      7. 多个会话的统计信息的饼图。从饼图中可以看到,这一次选中的多个Session使用的MIME类型有HTML、JPEG、PNG。同样,单击饼图上面的Collapse Chart链接,可以再次隐藏该饼图。
  5. 整理Session信息
    1. 在使用Fiddler捕获网站信息时往往会捕获到海量的Session信息。为了方便查找和分析,需要对Session信息进行简单整理,如标记重要的会话、删除没用的会话、提取特定会话信息。
    2. 标记Session,简单分析Fiddler捕获的Session后,可以将重要或无用的Session进行标记。如果标记错误,也可以取消标记。标记Session,Fiddler允许用户通过颜色和删除线对Session进行标记,具体的操作方法如下:
      1. 选中要标记的Session。在菜单栏中,依次选择Edit|Mark命令,子菜单中会显示所有标记方法。对Session进行标记,选择标记使用的颜色或删除线。标记后的效果。选中Session后,也可以右击该Session,在弹出的快捷菜单中选择Mark命令进行标记。Mark的子菜单中显示了用于标记Session的可选颜色和删除线命令,具体说明如下:
        1. Strikeout:使用删除线标记。
        2. Red:将字体改为红色。
        3. Blue:将字体改为蓝色。
        4. Gold:将字体改为金色。
        5. Green:将字体改为绿色。
        6. Orange:将字体改为橙色。
        7. Purple:将字体改为紫色。
      2. 取消标记,对于标记错误的Session也可以取消标记。先选中要取消标记的Session,然后在菜单栏中依次选择Edit|Mark|Unmark命令即可。
    3. 删除Session,对于无用的Session信息,用户可以直接删除,避免影响后期的分析。删除Session的方法如下:选中要删除的Session,在菜单栏中依次选择Edit| Remove命令,子菜单中会显示删除的方法。这里删除选中的会话。选择Selected Sessions命令删除会话。此时,Session列表中只剩下30个会话了。选择Session后,也可以通过右键菜单中的Remove命令进行删除。Session列表中一共有44个Session,选中了第31~44个Sesssion,共14个会话。Remove的子菜单中显示了用于删除的方法,具体说明如下:
      1. Selected Sessions:删除选择的会话。
      2. Unselected Sessions:删除未被选择的会话。
      3. All Sessions:删除所有会话。
    4. 提取信息,为了进一步分析会话信息,可以对会话信息进行提取。
      1. 提取Session信息,每个Session都保存了客户端和服务器的完整的数据请求和响应。因此,一个Session包含请求信息(如请求行、请求头和请求体)和响应信息(如响应行、响应头和响应体)。选择Session后,依次选择Edit|Copy|Session命令,即可提取Session信息。
      2. 仅提取Session头信息,Session头信息包括请求(请求行、请求头)和响应(响应行、响应头)的头信息。选中对应的Session,在菜单栏中依次选择Edit|Copy|Headers only命令,即可提取头信息。
      3. 提取Session摘要信息,Session摘要信息包含Session列表中显示的基本信息,如Result和Protocol等。提取时,用户可以提取全部信息,也可以提取简略的信息。
        1. 提取全部摘要信息,选择要提取摘要信息的Session。图中选择的是第5个会话,该会话所在列表显示的每个列标题对应的信息就是全部的摘要信息。在菜单栏中,依次选择Edit|Copy|Full Summary命令,进行信息提取。
        2. 演示提取简略的摘要信息的方法。在菜单栏中依次选择Edit|Copy|Terse Summary命令。
      4. 提取指定列信息,在提取摘要信息时,有时候不需要全部提取,只需提取指定列的摘要信息。这时,可以右击对应的列,然后使用右键菜单命令进行选择。这里选择的是第5个Session,当前列为Host列,对应的值为www.baidu.com。提取Host列信息,依次选择Copy|This Columu命令。
      5. 提取DataURI信息,Data URI(Uniform Resource Identifier,统一资源标识符)定义了接受内容的协议及附带的相关内容。Fiddler允许用户提取该信息。右击目标Session,在弹出的快捷菜单中依次选择Copy|Response DataURI命令即可。提取到的DataURI信息主要分为4部分,每部分的含义如下:
        1. data:表示协议头,标识这个内容为一个Data URI资源。
        2. text/html:表示MIME类型,指定数据的展现方式。例如,图片显示为image/jpeg;文本类型显示为text/plain等。
        3. base64:表示数据的编码方式。
        4. 其他内容:表示Data URI资源数据内容。

捕获数据

  1. 通过Fiddler可以捕获客户端向服务器发送的请求包,也可以捕获服务器返回的响应包。为了获得想要的响应包,可以在捕获数据包之前进行相应的配置,如修改客户端状态、使用捕获过滤器。
  2. 修改客户端状态,客户端发送请求,服务器根据请求返回对应的响应包。因此,请求信息起着关键作用。在获取数据包之前,可以对客户端进行相关设置。
    1. 设置User-Agent,User-Agent(用户代理,简称UA)是HTTP中的一部分,通过它服务器能够识别客户可能使用的操作系统平台。网站根据浏览器提交的UA,返回不同的内容。Fiddler支持常见的各种UA。设置UA,并查看效果。启动Fiddler。通过浏览器访问网站,查看捕获到的会话。其中,第81个会话显示访问了www.163.com网站。右侧显示了相应的User-Agent信息,此时是浏览器自己提交的UA信息。在浏览器中,网站的显示效果是在台式机上的显示效果。将UA设置为在苹果手机上显示。依次选择Rules|User-Agents|iPhone6命令。再次访问网站,查看捕获到的数据包信息。其中,User-Agent信息显示为设置的iPhone。此时,网站的显示效果为手机访问效果。
    2. 设置网络模式,通信采用的网络模式多种多样。为了分析网页在慢速网络中的加载情况,需要限制网络的加载速度。Fiddler提供了慢速网络模拟功能,只要选择Rules|Performance| Simulate Modem Speeds命令即可。
    3. 设置编码方式,在会话发出请求时,浏览器会提交编码请求,说明编码方式是否可接受,如GZIP编码。针对编码方式,Fiddler提供了相应的设置。例如,要支持GZIP编码方式,需要依次选择Rules|Apply GZIP Encoding命令,勾选该命令;如果不支持所有编码方式,需要依次选择Rules|Remove All Encodings命令,勾选该命令。
  3. 捕获过滤,在捕获会话时,往往会捕获到大量的会话。其中,很多会话缺少分析价值。为了避免这些数据的干扰,在捕获前可以设置捕获过滤器,不捕获特定类型的数据包。
    1. 快速过滤,快速过滤是指不捕获特定类型的会话。例如,图片和CONNECT会话往往不是分析的重点,因此在捕获之前,可以过滤掉此类会话。
      1. 过滤图片请求会话,网页加载显示的每个图片都会产生一个会话。由于图片数据往往缺少分析价值,可以将其过滤掉。选择Rules|Hide Image Requests命令,勾选该命令,这样就不会捕获图片请求会话。
      2. CONNECT捕获过滤器,CONNECT是HTTPS为了后续传输数据而建立的会话。由于这个过程并不传输真正的网页数据,所以也不需要分析。用户可以单击Rules|Hide CONNECTs命令,勾选该命令,避免捕获到该类型的会话。
    2. Filters选项卡,Filters选项卡提供了一种“即指即点”的方式,可以很方便地将简单的过滤规则应用到正在捕获的数据流上。用来过滤自己想要的会话,避免产生过多的会话信息,便于分析。启动Fiddler,默认情况下捕获过滤器是没有启用的,Fiddler会捕获所有HTTP、HTTPS、FTP协议的本地数据流。Filters选项卡位于Web Session列表的右侧,单击该选项卡可以看到没有应用任何过滤器。
      1. 选中Filters选项卡左上方的Use Filters复选框后,就可以使用随后显示的过滤器对流量进行过滤了。过滤器的过滤条件可以是数据流的来源(如特定的客户端进程),也可以是数据流本身的某些特征(如该数据流所绑定的主机名和服务器返回内容的类型)。
  4. 通过Hosts主机过滤,Hosts选项框提供根据主机名过滤的功能来过滤会话。在该选项栏中,我们可以看到有两个下拉列表框,分别为No Zone Filter和No Host Filters。单击下拉列表框右边的小三角,可以通过展开的列表项设置过滤器来捕获会话。
    1. 是否显示互联网主机的会话,展开No Zone Filter下拉列表框,可以看到Show only Intranet Hosts和Show only Internet Hosts。前者支持只显示内网主机的会话。后者只显示互联网主机的会话。选择Show only Intranet Hosts命令,然后通过浏览器访问网站(如www.baidu.com)。访问网站成功后,会看到在Fiddler的Web Session列表中没有捕获到任何会话。这说明只显示内网的会话,而不会显示任何互联网主机上的会话。
      1. 选择Show only Internet Hosts命令,通过浏览器访问网站(如www.baidu.com),访问网站成功后,我们会看到在Fiddler的Web Session列表中捕获到了互联网的会话。
    2. 隐藏指定主机名的会话,展开No Host Filters下拉列表框,可以看到Hide the following Hosts、Show only the following Hosts和Flag the following Hosts。它们分别表示隐藏以下主机名、只显示以下主机名和标记以下主机名。
      1. 选择Hide the following Hosts命令,然后在下面的文本框中输入主机名(如www.qq.com)。这代表Fiddler只隐藏主机名为www.qq.com的会话,而不会隐藏其他会话(如wis.qq.com、p.l.qq.com等)。可以在文本框中输入多个Host,使用分号分隔。在文本框中输入主机名后背景为黄色,代表设置没有生效,单击文本框以外的任何地方,使其黄色背景消失,代表设置生效。设置生效后,通过浏览器访问网站,访问成功后的界面。
    3. 只显示指定主机名的会话,我们有时候去访问一个网址会捕获到很多会话,例如访问腾讯网址(http://www.qq.com/),捕获到有关该网址的许多会话。
      1. 对于捕获到的这些会话,我们只需要分析其中一个会话就够了。为了能够快速找到自己想要的会话,避免其他会话的干扰,我们只需要过滤目标主机名的会话就可以了。下面是操作方法。
      2. 在No Host Filters下拉列表框中选择Show only the following Hosts命令。在文本框中输入主机名(如www.qq.com)。然后在浏览器中访问该网站和其他网站。访问成功后,回到Web Session列表查看捕获的会话,发现只显示了主机名为www.qq.com的会话。
    4. 标记指定主机名的会话
      1. 启动Fiddler,在浏览器中访问任意网站会捕获到许多会话。这些会话的主机名各不相同,我们有时候需要快速找出相关的几个主机名的相关会话。这时,可以进行设置,将捕获的相关主机名的会话进行标记。
      2. 在No Host Filters下拉列表框中选择Flag the following Hosts命令。在文本框中输入主机名(如www.qq.com:email.163.com)。然后在浏览器中访问该网站和其他网站。访问成功后回到Web Session列表查看捕获的会话,发现其中显示捕获的所有会话。其中,主机名为www.qq.com和email.163.com的会话被标记了,其他的会话没有被标记。
  5. 通过客户端进程过滤,进程过滤器可以控制显示哪个进程的数据流。在Client Process选项框中可以看到有3个复选框。可以通过选中它们,捕获客户端特定进程下的会话。只有正在运行的客户端和Fiddler在相同的主机上时,Fiddler才能判断出是哪个进程发出的请求。
    1. 只显示指定进程下的数据流,Fiddler捕获会话时,默认捕获的是本地所有进程的会话,这给用户分析会话带来很大的不便。这时可以指定进程,只捕获该进程下的数据流。这样,就方便对捕获的会话进行分析了。
      1. 勾选Client Process选项框中Show only traffic from前面的复选框。单击最右边的小三角,展开下拉列表框列表项。该列表包含系统中当前正在运行的所有进程。
      2. 可以看到系统中正在运行的所有进程。其中,开启的进程有IE浏览器和360浏览器。选择其中一个浏览器(如360浏览器),在IE浏览器和360浏览器中分别浏览网站。回到Fiddler中查看捕获的会话,会发现在Process列中显示的进程都是360浏览器下的会话,没有捕获到通过IE浏览器访问的网站的会话。
    2. 只显示进程名称以IE开头的数据流,勾选Client Process选项框中Show only Internet Explorer traffic复选框,将会只捕获进程名称以IE开头或请求的User-Agent包含compatible:MSIE的数据流。设置完成后,使用不同的进程后,查看Fiddler捕获的会话。我们可以看到捕获的会话都是IE进程下的会话。
    3. 隐藏svchost.exe进程的数据流,svchost.exe是微软Windows操作系统的系统程序。该进程也会产生HTTP会话。对于这些无用的会话请求,我们可以进行隐藏,勾选Hide traffic from Service Host复选框即可。
  6. 通过响应状态码过滤
    1. 每一个会话都有对应的响应状态码,它们代表会话的不同类型和含义。我们可以通过给出的选项,基于响应状态码过滤会话。一般通过浏览器访问网站,大部分都会访问成功,如果想要分析其他会话(请求未成功),我们可以进行设置,把请求成功的会话过滤掉。勾选Hide success(2xx)复选框,然后通过浏览器访问网站,返回Fiddler的Web Session列表,会发现捕获会话的响应状态码没有200~299范围内(包含200和299)的会话了。五个选项,可以根据响应状态码来过滤会话。下面是每个选项的具体含义。
      1. Hide success(2xx):隐藏状态码在200~299范围内(包含200和299)的响应。这些状态码用来表示请求成功。
      2. Hide non-2xx:隐藏状态码不在200~299范围内的响应。
      3. Hide Authentication demands:隐藏状态码为401和407的响应,这些响应需要用户进一步确认证书。
      4. Hide redirects:隐藏对请求进行重定向的响应。
      5. Hide Not Modified:隐藏请求中状态码为304的响应,表示客户端缓存的实体是有效的。
  7. 通过响应类型和大小过滤,Fiddler捕获的会话类型各不相同,会话响应体的大小也不相同。对于这些会话,我们可以通过设置捕获过滤器只捕获指定类型的会话,也可以在捕获时隐藏响应体范围内字节数的会话。
    1. 从图中可以看到一些选项和一个下拉列表框。通过设置这些选项,可以在捕获数据流时控制在Web Session列表中显示的响应类型。单击下拉列表框右边的小三角展开列表项。列表支持隐藏响应不是指定类型的Session。下面是列表项的具体含义。
      1. Show all Content-Types:不过滤。
      2. Show only IMAGE/*:隐藏Content-Type非图像类型的Session。
      3. Show only HTML:隐藏Content-Type非HTML类型的Session。
      4. Show only TEXT/CSS:隐藏Content-Type非文本/CSS类型的Session。
      5. Show only SCRIPTS:隐藏Content-Type非脚本类型的Session。
      6. Show only XML:隐藏Content-Type非XML类型的Session。
      7. Show only JSON:隐藏Content-Type非JSON类型的Session。
      8. Hide IMAGE/*:隐藏Content-Type为图片类型的Session。
    2. 捕获指定类型的会话,如果希望Fiddler只捕获图片类型的Session,在下拉列表框中选择Show only IMAGE/*,然后在浏览器中访问任意网站。此时,捕获到的会话都是图片类型的。如果不想捕获到图片类型的会话,可以在下拉列表框中选择Hide IMAGE/*。我们可以根据实际需要通过下拉列表项来隐藏响应不是指定类型的Session。操作方法与前面类似,这里不再赘述了。
    3. 捕获响应体规定范围的会话,下拉列表框的下面有两个选项:Hide smaller than用于隐藏响应体小于指定的字节数的响应;Hide larger than用于隐藏响应体大于指定字节的响应。可以在选项后面的文本框中设置大小。例如,要捕获响应体字节数大小为5k~7k的会话,可以通过该选项设置来完成。
  8. 通过响应头内容过滤,Fiddler捕获到的会话响应头的内容是不同的。我们来查看会话的响应头的内容。选中一个会话,单击Web Session列表右侧的Inspectors选项卡,然后单击中间的Headers选项卡,就会看到会话的响应头内容。右下方就是选中会话的响应头的内容。了解响应头的内容后,我们就可以根据响应头的内容来捕获相关的会话了。Fiddler的Filters选项卡的最下方提供了一些选项。用户可以通过图中的这些选项,在捕获时捕获或不捕获指定响应头名称的会话,也可以自己创建响应头。
    1. 捕获响应头中包含Set-Cookie响应的会话并显示,响应头中的Set-Cookie代表服务器发送Cookie相关的信息。如果用户需要查看Fiddler捕获的会话中哪些会话的响应头中包含Set-Cookie,一个一个查看显然比较麻烦。我们可以在捕获时进行过滤显示,将响应头中包含Set-Cookie响应的会话显示出来。这样,更方便用户查找。下面是设置的方法。在Response Headers中勾选Flag responses that set cookies复选框,然后在浏览器中访问一些网站。成功访问后,捕获的所有会话中,响应头中包含Set-Cookie的会话会以斜体的形式显示出来。
    2. 捕获指定HTTP响应头名称的会话并显示,Fiddler捕获的会话包含的响应头内容比较多。要想找出响应头中包含指定内容名称的会话,一个一个去查看显然不可行。我们也可以在捕获时进行过滤显示,将HTTP响应头中包含指定名称的会话显示出来,方便用户查找。在Response Headers中,勾选Flag responses with headers选项,在后面的文本框中输入HTTP响应头内容的名称(如Location)。设置完成后,Fiddler在捕获会话时,如果捕获的会话响应中存在该HTTP头名称,将会以粗体的形式显示出来。第11个会话包是加粗的,访问的网站是www.baidu.com,并且在响应头中可以看到Location:https://www.baidu.com/。这说明已经成功显示HTTP响应头内容包含指定Location的会话。如果想使捕获的第11个会话中不包含响应头内容名称Location,那么在Response Headers中勾选Delete responses headers复选框,在后面的文本框中输入Location。设置完成后,继续访问www.baidu.com网站,查看捕获该会话的响应头内容。这时,就发现响应头内容不再包含名称Location。
    3. 自定义响应头内容,默认情况下,捕获的会话响应头的内容是自动生成的,我们还可以创建HTTP响应头,自己设置取值。例如,我们把响应头中Content-Length的值设置为80(服务器发送显示的字节码长度)。在Response Headers中勾选Set response header复选框,在后面的文本框分别输入Content-Length和80,访问网站后,查看捕获到的会话响应头内容。

Session的分类、过滤与搜索

  1. 在抓包中,Fiddler往往会抓取到客户端访问网站产生的大量会话(Session)。例如,客户端可能在听音乐、看视频或者浏览图片。用户需要在众多的会话中找到自己需要的会话。
  2. Session的类型,启动Fiddler后,Web Session列表会显示捕获的各种会话。为了方便用户分析,Fiddler将这些会话根据类型进行分类标记。
    1. 在Fiddler的菜单栏中依次选择File|Load Archive命令,打开一个已经捕获到的文件。从Session列表可以看到,每个会话前面都有一个小图标。不同图标代表不同类型的会话。下面简单介绍不同图标代表的会话类型。:正在向服务器发送请求。:正在从服务器接收请求内容(下载响应)。:请求停止于断点处,允许对它进行修改。:响应停止于断点处,允许对它进行修改。:请求使用的是HEAD或OPTIONS方法,返回HTTP/204状态码。使用该方法客户端无须下载内容就可以获取目标URL或服务器的信息。:请求使用POST方法向服务器发送数据。:请求使用CONNECT方法。使用该方法构建传送加密HTTPS数据流的通道。:响应内容为HTML文件。:响应内容为图片文件。:响应内容为脚本文件。:响应内容为CSS文件。:响应内容为XML文件。:响应内容为JSON文件。:响应内容为音频文件。:响应内容为视频文件。:响应为HTTP/3xx类重定向。:服务器端错误,响应包含HTTP/4xx或HTTP/5xx错误状态码。:Session被客户端应用、Fiddler或服务器终止。:响应状态是HTTP/304,表示客户端缓存的副本已经是最新的了。:响应Content-Type没有专用的图标。:响应内容为Flash小应用程序。:响应为HTTP/401或HTTP/407,要求客户端进行认证;或者响应为HTTP/403,表示访问被拒绝。
  3. 高级过滤,了解了Session的种类后,我们就可以通过类型过滤的方法,找到相关类型的所有Session。在Web Session列表和状态栏之间有一个黑色的QuickExec文本框。QuickExec支持根据指定的搜索条件快速过滤出用户感兴趣的数据流。用户可以在QuickExec文本框中输入响应命令来对Session进行过滤。
    1. 通过select过滤,select可以从所有响应类型(指Content-Type)中过滤出指定类型的HTTP请求。下面是各选项的功能:select image过滤图片类型的会话;select css过滤所有响应类型为CSS的请求;select html过滤所有响应类型为HTML的请求。Content-Type(内容类型)是HTTP响应头中的字段,用于定义网络文件的类型和网页的编码格式,决定浏览器将以什么形式、什么编码格式读取这个文件。
      1. 过滤图片类型的会话,通过select image命令过滤图片类型的会话。在QuickExec文本框中,输入select image,显示结果。从会话列表可以看到,符合条件的Session被高亮显示出来,并且Web Session列表中的Content-Type列标题内容有image/gif、image/png、image/jpeg等,说明过滤出来的Session为图片类型的会话。用户也可以直接输入select image/gif,过滤出GIF格式的会话。
      2. 过滤CSS类型的会话,通过select css命令过滤所有响应类型为CSS请求的会话。在QuickExec文本框中输入select css,显示结果。从会话列表中可以看到,符合条件的Session被高亮显示出来,并且Web Session列表中的Content-Type列标题内容是text/css,说明过滤出来的Session为CSS类型的会话。
      3. 过滤HTML类型的会话,通过select html命令,过滤所有响应类型为HTML的会话。在QuickExec文本框中输入select html,显示结果。从会话列表中可以看到,符合条件的Session被高亮显示出来,并且Web Session列表中的Content-Type列标题内容为text/html、text/html;charset=GB2312等,说明过滤出来的Session为HTML类型的会话。Content-Type属性指定响应的HTTP内容类型。如果未指定Content-Type,则默认为text/html。
      4. 过滤包含指定字符串的会话,过滤Content-Type中包含指定字符串的会话,通过select javascript命令过滤Content-Type中包含javascript的会话。在QuickExec文本框中输入select javascript,过滤结果。从会话列表中可以看到,符合条件的Session被高亮显示出来,并且Web Session列表中的Content-Type列标题内容包含字符串javascript。
    2. 通过?过滤,在Fiddler捕获到的许多会话中,URL基本是不相同的。要想找出包含指定字符串的URL的会话,可以通过过滤的方法查找。在Fiddler中,使用?对会话的URL进行查找。下面通过? baidu命令,过滤URL中包含baidu的会话。在QuickExec文本框中,输入? baidu,过滤结果。
    3. 通过allbut过滤,allbut命令用于根据响应类型过滤出指定类型的会话,并且会把其他类型的会话删除。下面通过allbut css命令,把响应类型为非CSS的会话全部删掉,只留下是响应类型为CSS的会话。在QuickExec文本框中,输入allbut css,过滤结果。从图中可以看到只有两个会话,并且均为CSS类型,其余类型的会话都被删掉了。
    4. 通过会话大小过滤,Fiddler捕获的会话响应的字节数不同。通常,播放视频的会话要比浏览图片的会话的字节数多很多。用户可以根据响应体的字节数,缩小查找会话的范围。Fiddler提供的表达式可用于过滤响应体大小处于某一范围内的会话。其中,>size用于过滤响应体大小超过指定字节数的会话;<size用于过滤响应体大小小于指定字节数的会话。下面通过>4k命令,过滤响应体超过4KB的会话。在QuickExec文本框输入>4k,显示结果。从会话列表中可以看到,符合条件的Session被高亮显示出来。其中,Body列显示的响应大小都大于4KB。
    5. 通过@Host过滤,每个会话都有其对应的主机名。要查找具有相同的Host字符串的相关会话,不需要逐一查看,可以通过过滤的方法进行筛选。Fiddler提供了@符号进行过滤。通过@qq.com命令,过滤请求头Host中包含字符串qq.com的会话。在QuickExec文本框中,输入@qq.com,过滤结果。从会话列表中可以看到,符合条件的Session被高亮显示出来。这些会话的Host列的值都包含字符串qq.com。
    6. 通过=status过滤,每个会话都有对应的响应状态码,用于标识会话的情况。用户可以通过过滤的方法筛选指定响应状态码的会话。Fiddler提供的=可实现该功能。通过=304命令,过滤响应状态码为304的会话。在QuickExec文本框中,输入=304,过滤结果。从会话列表可以看到,符合条件的Session被高亮显示出来,并且在Result列中可以看到响应状态码都为304。
    7. 通过=Method过滤,会话的请求多种多样。如果想找出同一类型请求的会话,最简单的方法就是通过过滤筛选。Fiddler提供以下两种方式进行过滤。=GET表示过滤请求方法为GET的会话、=POST表示过滤请求方法为POST的会话。通过=GET命令,过滤请求方法为GET的会话。在QuickExec文本框中,输入=GET,过滤结果。从会话列表可以看到,符合条件的Session被高亮显示出来。选中任意一个会话,然后在右边的Inspectors选项卡的头部信息Header中可以看到会话的类型。此时,过滤出的HTTP会话的请求方法为GET。过滤和查看HTTP方法为POST的会话,操作方法与此类似,这里就不再赘述了。
  4. 全文搜索
    1. Fiddler支持用户进行全文搜索,在会话的请求和响应中,搜索指定的字符串。一旦搜索到,Fiddler将通过颜色高亮的方式显示结果。在菜单栏中,依次选择Edit|Find Sessions…命令,或者使用快捷键Ctrl+F,打开Find Sessions对话框。
    2. Find Sessions对话框支持搜索捕获到的请求和响应,并选中包含指定文本的Session。下面是该对话框各部分的功能。Find文本框用于输入要搜索的文本。Search下拉列表框用于指定搜索目标,包括Requests and responses(请求和响应,默认值)、Requests only(只搜索请求)、Responses only(只搜索响应)和URLs only(只搜索URL);Examine下拉列表框用于指定搜索的范围,如搜索Session的Headers、Bodies或者是两者都搜索(默认值);Result Highlight下拉列表框设置高亮的背景颜色,所有包含搜索文本的Session都会应用该背景颜色。默认颜色为黄色。
    3. 下面介绍全文搜索会话的方式。
      1. 在Find文本框中输入www.qq.com,其他使用默认值。然后,单击Find Sessions按钮,开始执行搜索,并关闭Find Sessions对话框。Web Session列表将高亮显示匹配的搜索结果。
      2. 再次打开Find Sessions对话框,默认使用的颜色(黄色)已经变成其他颜色了,如图4.16所示。这样,再次搜索会话时,会交替使用不同的颜色标记搜索出的结果。
      3. 如果想高亮显示其他会话(如www.baidu.com的会话),而不再高亮显示www.qq.com的相关会话,勾选Select matches复选框即可。如果想一直使用当前颜色来显示要搜索的会话,就勾选Unmark old results复选框。设置好以后,显示结果。
      4. 如果想用不同颜色来高亮显示不同的搜索会话,可取消选中Select matches复选框和Unmark old results复选框,再一次执行Find Sessions操作即可。显示结果。
      5. 黄色高亮显示的是www.qq.com的会话。绿色高亮显示的是www.baidu.com的会话。

HTTP请求

  1. HTTP请求是客户端发给服务器端的请求消息。请求信息不仅包含客户端要访问的信息,还包含客户端的配置信息以及传输方式信息。服务器端根据这些请求信息,决定如何向客户端返回信息。
  2. HTTP请求的构成,Fiddler捕获到的会话由HTTP请求和HTTP响应构成。在Session列表的右侧,选择Inspectors选项卡,可以查看HTTP请求的相关信息。该部分中上端提供了一些选项卡,用于查看HTTP请求的相关信息。
    1. HTTP请求消息由3部分构成,分别为请求行、请求头、请求体。这里,使用序号标出了HTTP请求的每个部分。第一部分为请求行(request line);第二部分为请求头(request header);第三部分为请求体(request body)。请求头和请求体之间由一个空行分隔。打开一个捕获的文件,选择一个会话,在HTTP请求部分中切换到Raw选项卡,可以查看HTTP请求的原始数据信息。
  3. 请求行,请求行由3部分组成。其中,METHOD表示请求的方法(如POST、GET);path-to-resoure表示请求的资源(请求对应的URL);HTTP/version-number表示HTTP以及版本号。
    1. 请求方法,HTTP支持多种请求命令,这些请求命令称为请求方法。请求方法会告诉Web服务器要执行的动作。从图5.3中可以看到,该会话的请求方法为POST,表示它要执行的动作是向服务器发送需要处理的数据,如HTML表单数据;请求的URL为http://impservice.dictword.youdao.com/imp/request.s,会话的协议为HTTP/1.1。HTTP会话的请求方法有许多种,下面是每种请求方法及其含义。
      1. GET:从服务器获取一份文档。
      2. POST:向服务器发送需要处理的数据。
      3. HEAD:从服务器获取文档的消息报头。
      4. OPTIONS:指定可以在服务器上执行哪些方法。
      5. PUT:将请求的主体部分存储在服务器上。
      6. DELETE:从服务器上删除一份文档。
      7. TRACE:对可能经过代理服务器传送到服务器上的报文进行追踪。
    2. GET请求方法,GET请求方法可以从Web服务器上获取一份文档。例如,通过浏览器访问一个网页就会产生GET请求。在这个过程中,客户端根据URL请求服务器,服务器返回客户端想要的页面。在请求的过程中,客户端可以通过URL附加额外的数据并发送给服务器。
      1. 传输数据的方式,在请求过程中,客户端可以将传递的数据添加到URL后面,并使用问号(?)进行分隔。而传递数据的形式为“参数名=参数值”。如果存在多个数据,则参数之间需要使用&分隔。如果传输的数据是英文字母、数字或某些标点符号,它们会直接作为参数值进行传递。如果传输的数据包含其他字符(如中文),则这些字符将由URL编码后再发送给服务器。通过Fiddler抓包验证传输数据的方式。启动Fiddler,在百度首页中搜索关键词fiddler,将成功显示与fiddler相关的信息。其中,fiddler为客户端要传输的相关数据。该数据将被添加到URL后面。Fiddler捕获到相应的会话。选择该会话,在请求行的网址中可以看到传递的数据。由于网址较长,为了方便讲解,这里将网址提取出来。其中,https://www.baidu.com/s为URL;问号(?)后面为传输的数据。每个数据的格式均为“参数名=参数值”,如ie=utf-8。由于有多个参数,因此每个参数之间使用&进行分隔。在这些参数中可以找到输入的关键词fiddler,其格式为wd=fiddler。由于fiddler为英文字母,因此直接被传递了,而没有进行URL编码。搜索“fiddler工具”,成功显示与该搜索内容相关的信息。查看捕获到的会话。可以看到传递的数据进行了URL编码,如图5.7所示。此时,可以看到wd=fiddler%E5%B7%A5%E5%85%B7。其中,搜索的fiddler未进行URL编码。由于“工具”是中文字符,所以进行了URL编码,结果为%E5%B7%A5%E5%85%B7。最终,将编码后的数据添加到URL后面发送给了服务器。
      2. URL编码,为了方便用户构建和分析这类编码字符串,Fiddler自带了URL编码和解码功能。用户可以输入数据进行URL编码,查看编码后的信息。在菜单栏中依次选择Tools|TextWizard命令,弹出TextWizard对话框。上半部分用来输入信息,下半部分用来显示编码后的信息。在Transform下拉列表中可以选择转换方式。例如,对中文字符“工具”进行URL编码,选择URLEncode转换方式。在下半部分将显示编码后的结果。将中文字符“大学霸”进行URL编码,其结果为%E5%A4%A7%E5%AD%A6%E9%9C%B8。
      3. URL解码,URL解码是URL编码的逆操作。Fiddler自带了解码功能。解码时需要选择URLDecode转换方式。例如,对字符串%E5%A4%A7%E5%AD%A6%E9%9C%B8进行解码,在下半部分将显示解码结果。
      4. 快速查看传输的数据,如果网址特别长,需要左右拖动状态条才能查看。Fiddler提供了快速查看功能。选择会话,在HTTP请求部分单击WebForms标签,将在列表中显示传输的数据信息。
    3. POST请求方法,由于URL长度受限,GET请求方法能传递的数据有限。HTTP提供了POST请求方法,用于向服务器发送更多数据。这些数据包含在响应体中,例如,客户端输入用户名和密码提交表单进行登录时,往往产生POST请求。当Fiddler捕获到对应的会话,就可以查看用户提交的表单信息了。
      1. 捕获用户提交的表单信息。启动Fiddler,填写注册邮箱的信息。单击“立即注册”按钮,将这些数据提交给服务器。Fiddler捕获到相应的会话。在请求行中可以看到请求方式为POST,并且在请求体中看到了提交的相关信息,如name=zjh123smz。其中,zjh123smz就是注册信息时填写的邮件用户名。切换到WebForms选项卡,也可以看到填写的相关信息。
  4. 客户端信息,HTTP请求的第二部分为请求头。该部分包含许多字段,并以“属性名:属性值”的格式进行显示。通过这些字段,用户可以了解到客户端信息。
    1. 可接受信息,客户端向服务器发出请求后,服务器会根据请求返回相应的信息。而返回的信息必须是客户端支持的格式。因此在发出请求时,客户端必须告诉服务器自己可接受哪些类型的数据。
      1. 可接受的媒体类型,HTTP请求的资源可能涉及多种类型,如图片、音频、视频等。在请求头中,Accept字段表示客户端可以接受的媒体类型。该字段的语法格式如下:Accept:type;params=val。其中,type表示媒体类型。多个类型之间使用逗号(,)进行分隔;params表示媒体类型的参数,val为参数值。参数与媒体类型之间使用分号(;)进行分隔。常见的媒体类型。下面通过Fiddler查看客户端可接受的媒体类型。其中,Accept字段的值为application/javaScript,/;q=0.8,表示客户端可接受JavaScript文本类型和所有媒体类型。其中,q表示相对品质因子,代表媒体类型的质量值。取值范围为0~1,默认值为1。因此,该字段最终表示,客户端最想接受的类型是JavaScript文本类型,但是也会接受所有媒体类型。
      2. 可接受的编码方式,编码方式是指通过特定的计算技术,将一种格式转换为另一种格式。请求头的Accept-Encoding字段表示客户端可以接受的编码方式。该字段的语法格式如下:Accept-Encoding: codings params=val。其中,codings表示编码方式。常见的编码方式及其含义。下面查看客户端支持的编码方式。其中,Accept-Encoding字段值为gzip,deflate,表示客户端支持gzip和deflate压缩。
      3. 可接受的语言类型,很多网站为了让更多浏览者访问,提供了多语言版本。这时,就可以在请求头中使用Accept-Language字段,指定客户端可以接受哪些语言。该字段的语法格式如下:Accept-Language: language params=val。其中,language表示语言。常见的语言及其含义。语言类型分为两部分,前半部分为语言,后半部分为国家或地区。例如,zh-CN,其中zh表示中文,CN表示中国。下面查看客户端支持的语言。其中,Accept-Language字段的值为zh-CN,表示客户端支持简体中文。
    2. 用户代理,请求头中的User-Agent字段信息表示客户端使用的操作系统及其版本、CPU类型、浏览器及其版本等信息。该字段的语法格式如下:User-Agent: 1*( product | comment )。其中,product表示产品类型;comment表示注释信息。常见的代理类型及含义。下面查看客户端的UA信息。其中,Windows NT 6.1表示客户端操作系统的内核版本,WOW64表示客户端是64位操作系统。
  5. 其他字段,除了上面介绍的字段以外,请求头还包含其他字段。下面介绍其余一些常见的字段及其作用。
    1. 引用网址,客户端访问网页往往有两种方式。第一种,直接在地址栏中输入网址进行访问。第二种,在当前网页A中单击一个链接,进入到对应的网页B。第一种访问方式的HTTP请求中不会显示引用网址,因为它没有起始网址。在第二种访问方式中,网页B的HTTP请求中会出现一个Referer字段,用来显示引用网址(网页A的网址),表示该页面是从网页A处跳转过来的。其中,Referer字段的语法格式如下:Referer : ( absoluteURL | relativeURL )。其中,absoluteURL表示绝对的URL,relativeURL表示相对的URL。演示Referer字段的作用。在浏览器中,访问百度首页。该网页的网址为https://www.baidu.com/。在该页面中,包含一个“新闻”链接。单击“新闻”链接,将会跳转到对应的页面,成功显示新闻网页。该页面的网址为http://news.baidu.com/。Fiddler捕获到访问“新闻”链接的会话。该会话请求中包含Referer字段。其中,Referer字段的值是百度首页的网址https://www.baidu.com/,表示当前页面是从百度首页跳转过来的。
    2. 传输方式,客户端可以从服务器上获取信息。那么,客户端是通过哪种传输方式找到服务器从而获取信息的呢?下面介绍传输方式的相关字段。
      1. 请求连接方式,HTTP是基于TCP协议工作的。因此,在发送HTTP请求之前,需要先建立TCP连接。只有成功建立了TCP连接,客户端才可以发送HTTP请求,服务器才会返回响应。当不再进行请求时,就需要断开连接。该过程为“建立连接”→“客户端发送HTTP请求”→“服务器进行响应”→“断开连接”。这个过程在Fiddler中表现为一个会话。如果一个页面中包含许多张图片,而这些图片又来自同一个Web站点,那么在请求该页面时,每请求一张图片后就断开连接,然后在请求下一张图片时,重新建立连接。这样,非常浪费资源。为了避免这个问题,HTTP/1.0以后的版本使用了持久连接。它只需要与Web站点建立一次连接,然后依次请求该站点中的图片,并返回响应,直到所有的请求完成后断开连接。在HTTP请求头中使用Connection字段来表明请求的连接方式,该字段的语法格式如下:Connection :connection-token。其中,connection-token表示控制命令,用到的控制命令及其含义如下:keep-alive持久连接。只建立一次连接,多次资源请求都复用该连接,完成后关闭;close关闭连接。每次请求一个资源都建立连接,请求完成后连接立刻关闭。访问站点,查看此次请求的连接方式。在浏览器的地址栏中输入网址https://www.sina.com.cn/,访问新浪网站。可以看到,该网页中包含许多张图片。使用Fiddler捕获发送本次请求产生的会话,在Session列表中会捕获到多个会话。其中,第69个会话是请求站点的会话。该会话响应头中Connection字段的值为keep-alive,表示该请求使用的是持久连接。Session列表中出现的其他图片会话与请求站点使用了同一个连接。
      2. 使用域名请求,域名(Domain Name)是用来标识Internet上某一台或一组计算机的名称。服务器往往提供多个不同的域名。当客户端访问信息时,服务器需要知道客户端要访问哪个域名下的URL。因此,客户端在请求中需要使用Host字段,向服务器提供自己想要访问的那台机器的Internet主机名和端口。Host字段的语法格式如下:Host :host:[:port]。其中,host表示资源服务器的域名,port表示对应的TCP端口。查看会话中Host的字段信息。Host的值为i1.sinaimg.cn,表示该会话的域名。请求行的网址https://i1.sinaimg.cn/dy/deco/2013/0329/logo/LOGO_1x.png中包含该域名。

HTTP响应

  1. HTTP响应指的是服务器收到客户端发来的HTTP请求后返回给客户端的消息。这些信息包含客户端显示的网页、图片和Cookie等各种信息。
    1. HTTP响应的构成,在Session列表的右侧选择Inspectors选项卡,可以查看HTTP响应的相关信息。Fiddler提供多个选项卡,用于查看HTTP响应信息。HTTP响应消息由3部分构成,分别为响应行、响应头、响应体,其结构。其中,第一部分为响应行(response line);第二部分为响应头(response header);第三部分为响应体(response body)。响应头和响应体之间有一个空行。打开一个捕获的文件,选择一个会话,在HTTP响应部分中切换到Raw选项卡,可以查看HTTP响应的原始数据信息。
  2. 预处理,服务器向客户端发送响应消息时,如果响应消息的内容很大,为了减少在传输过程中花费的时间,服务器会对数据进行压缩编码。Fiddler捕获这样的响应包后,默认会自动识别并进行解码处理。但有时会识别错误,造成解码失败。这时,在分析之前要进行预处理,用户需要手动设置进行解码。Transformer选项卡提供了解码选项。信息分为3部分。第一部分表示响应体的大小;第二部分表示是否进行分块传输编码;第三部分表示是否进行内容压缩编码。其中,第三部分提供了一些内容压缩编码类型,供用户选择,其含义如下:None没有进行内容压缩编码;GZIP使用GNU ZIP格式进行压缩编码;DEFLATE使用ZLIB格式进行压缩编码;BZIP2使用BZIP2格式进行压缩编码;Brotli基于LZ77算法进行压缩编码;Use Zopfli to GZIP/DEFLATE使用Zopfli算法进行GZIP/DEFLATE压缩编码。
    1. 内容压缩编码,内容压缩编码是指服务器对响应报文中的响应体进行编码,以压缩的方式减少数据的传输量。如果响应进行了内容压缩编码,Fiddler没有自动处理,就需要用户进行设置了。对响应内容进行预处理。未成功处理的内容编码,在HTTP响应部分的上方会出现黄色栏Response body is encoded.Click to decode,并且在Transformer选项卡的第三部分显示了内容编码的类型,如图6.5所示。从图中可以看到,此时的内容编码类型为GZIP,编码后的响应体大小为7833字节,最下方的信息表示响应体的原始大小为13845字节,经过GZIP编码压缩了43.4%。切换到Raw选项卡,响应体内容显示为乱码。单击黄色提示信息Response body is encoded.Click to decode,响应体将成功解码,并且提示信息消失。返回Transformer选项卡,此时内容编码类型为None,响应体的大小为原始大小。
    2. 传输编码,传输编码改变了报文数据在网络上传输的方式,对整个报文进行分块传输编码。针对比较大的响应报文,这种方式允许服务器一边生成数据,一边进行传输,从而节省时间。如果响应进行了传输编码,而Fiddler没有自动处理,就需要用户进行手动设置了。启用传输编码预处理。未成功处理的传输编码,同样也会在HTTP响应部分的上方会出现黄色提示信息Response body is encoded.Click to decode,并且默认勾选了Chunked Transfer-Encoding复选框。此时,响应体的大小为997字节。单击提示信息Response body is encoded.Click to decode进行解码。解码后,将取消勾选的复选框。此时,响应体由997字节变为了985字节。
  3. 响应行,响应行由三部分组成。其中,HTTP/version-number表示HTTP的版本号;status-code表示响应状态码;message表示状态消息。
    1. 200 OK,状态码200(成功请求会话)是会话中最常见的响应状态码。它表示该请求成功完成,客户端已获取相应的请求资源。虽然成功请求了资源,但不代表服务器会成功返回资源的内容。
      1. 返回请求资源的内容,成功请求会话后,如果服务器返回了请求资源的内容,那么在响应中会包含响应体。例如,打开百度首页,捕获会话查看会话的响应行。从图中的响应行可以看到会话使用的协议为HTTP/1.1,响应状态码为200,状态消息为OK,在响应中包含响应体。
      2. 不返回请求资源的内容,有时候服务器不会返回响应体。
      3. 可以看出,该会话同样只有响应行和响应头,没有响应体。响应头中的Content-Length:0表示内容信息为0。复制该会话的URL,在浏览器中进行访问,效果。从图中可以看到,地址栏中出现了该会话的URL,但页面却显示了一个空白界面。
    2. 204 No Content,状态码204(无内容)的会话表示服务器成功处理了请求,但没有返回任何实质内容。这时,服务器返回给客户端的响应只有响应行和响应头,没有响应体。打开一个捕获的文件,找到状态码为204的会话,查看会话的响应行。
      1. 响应行可以看出,会话使用的协议为HTTP/1.1,响应状态码为204,状态消息为No Content。该响应行表示服务器成功处理了客户端的请求,但没有返回任何内容。第462个会话。该会话的状态码为204,表示无响应体。下面演示这类响应对浏览的影响。打开一个浏览器,访问一个除百度之外的网站。右击第462个会话,依次选择Copy|Just Url命令。在浏览器中访问该网页,效果。此时,地址栏已经出现百度的URL,但浏览器的页面没有任何变化。
    3. 301 Moved Permanently和302 Found,状态码301和302是重定向状态码,用来告诉浏览器客户端,它们访问的资源已被移动。此时,Web服务器会发送一个重定向状态码和一个可选的Location Header,告诉客户端新的资源地址。然后,浏览器客户端会自动访问Location Header指定的资源。其中,状态码301和302的区别如下:
      1. 301 Moved Permanently(永久移除):表示客户端请求的URL已移走,响应行中包含一个Location URL,说明资源现在的位置。服务器返回此响应时,客户端会自动访问这个新位置。
      2. 302 Found(找到):与状态码301类似,但这里的移除是临时的。客户端会使用Location中给出的URL,重新发送新的HTTP请求。
      3. 演示此类状态码对应的会话的作用。我们通过访问网站捕获此类状态的会话,并进行分析。
        1. 启动Fiddler,在浏览器中访问http://map.google.cn。捕获会话后,找到状态码301的会话,并查看会话响应。其中,第11个会话的响应状态码为301。在请求行中,请求的资源为http://map.google.cn,正是浏览器中输入的地址。其中,301 Moved Permanently表示永久移除,字段Location:http://ditu.google.cn/告诉客户端新资源的位置。客户端会自动发送一个请求,访问http://ditu.google.cn/,产生第12个会话。
        2. 选择第12个会话,查看会话的响应。会话的响应状态码为302,表示继续重定向。在该会话的请求行中,可以看到步骤(1)中指定的网址是http://ditu.google.cn/,代表该会话的确访问的是这个网址。由于还会重定向,在响应行中可以看到302 Found,以及Location:http://ditu.google.cn/maps。该信息表示客户端要访问的资源在这里,继续通过这个地址去访问。接下来客户端仍会自动发送一个请求,访问http://ditu.google.cn/maps。
        3. 选择第13个会话,查看会话的响应。会话的响应状态码为302,还需要重定向。在该会话的请求行中可以看到步骤(2)中指定的网址是http://ditu.google.cn/maps,代表该会话的确访问的是这个网址。由于还会重定向,在响应行中可以看到302 Found,以及Location:http://www.google.cn/maps,意思是告诉客户端要访问的资源在这里,继续通过这个地址去访问。接下来客户端仍会自动发送一个请求,去访问http://www.google.cn/maps。
        4. 选择第15个会话,查看会话的响应。可以看到,会话的响应状态码为200,代表请求成功。在该会话的请求行中可以看到请求的URL为http://www.google.cn/maps,即第13个会话重定向所指的地址。此时,状态码为200 OK,表示客户端已成功发出请求。
    4. 304 Not Modified,状态码304(未修改)表示客户端上次请求并缓存的资源并没有修改,客户端可以直接使用缓存中的资源。在Fiddler中,选择状态码为304的会话,查看会话的响应行。会话的状态码为304,状态消息为Not Modified。这表示服务器成功处理了客户端的请求,但没有返回任何内容。状态码为304和204的会话都不会返回内容,但是状态码为304的会话的请求资源仍然可以访问。例如,该会话请求网址为https://www.baidu.com/img/bd_logo1.png,表示一个图片资源。在浏览器中访问该网址,可以成功看到图片信息。
    5. 401 N/A,状态码401(未授权)表示服务器要求客户端进行身份认证,客户端需要正确输入用户名和密码才能获取资源的访问权。捕获登录路由器操作产生的会话,查看并分析会话的状态码和响应。在地址栏中输入路由器的网关地址,本例为192.168.12.1,弹出身份认证对话框。当输入的用户名或密码错误时,将产生401响应信息。使用Fiddler捕获会话并进行查看。
    6. 404 Not Found,状态码404(未发现)表示请求的网页不存在,如输入的URL错误。启动Fiddler,通过浏览器访问http://www.cnblogs.com/tesdf.aspx,查看捕获的会话。第127个会话的状态码为404,状态消息为Not Found。这代表请求的网页不存在。返回浏览器,查看效果。
    7. 501 Not Implemented,状态码501(未能实现)表示由于服务器无法满足客户端请求的某个功能,从而导致未能实现客户端的请求。例如,客户端访问路由器的管理页面时,如果在登录界面中没有输入认证信息而直接关闭页面,将会产生状态码为501的会话。查看该类型的响应信息。
    8. 502 DNS Lookup Failed或Connection Failed,状态码502(DNS查询失败或连接失败)表示由于服务器的网关故障,从而导致连接失败。例如,访问网址http://www.dd.pm19n.cn/favicon.ico将会产生状态码为502的会话,查看响应信息。
  4. 响应头,HTTP响应构成的第二部分为响应头。与请求头类似,响应头也包含大量字段。通过这些字段可以了解响应的内容信息和服务器信息。
    1. 内容信息,服务器在响应客户端的请求时,要告诉客户端响应内容的相关信息,如内容长度和内容类型等。
      1. 内容类型,服务器会在响应头中使用Content-Type字段,描述响应体的媒体类型。该字段的语法格式如下:Content-Type: media-type;charset=val。其中,media-type表示媒体类型;charset表示使用的字符集类型,并使用分号(;)与媒体类型进行分隔。常见的charset值及其含义。下面查看服务器返回的内容类型。这里选择的会话是一个CSS文件类型的会话。其中,响应头的Content-Type字段值为text/css;charset=utf-8,表示服务器的内容类型为CSS文本类型,并使用了UTF-8字符集。
    2. 响应体长度,如果响应部分中包含响应体,响应体往往有一定的长度。响应头使用Content-Length字段说明响应体的长度。该字段的语法格式如下:Content-Length:DIGIT。其中,DIGIT表示响应体的长度,单位为字节。下面查看会话的响应体长度。其中,Content-Length字段值表示该图片会话的响应体大小为3806字节。切换到Transformer选项卡,也可以查看响应体长度。
    3. 内容的编码类型,内容编码。如果服务器对响应体进行了内容编码,它会在响应头中使用Content-Encoding字段说明内容的编码类型。该字段的语法格式如下:Content-Encoding:content-coding。其中,content-coding表示内容的编码类型。下面查看响应对响应体的编码类型。其中,Content-Encoding字段值为bzip2,表示响应体采用了该类型的编码方式。此时,Transformer选项卡的HTTP Compression选项框中的BZIP2单选按钮会被选中。如果响应头中没有Content-Encoding字段,表示响应体没有进行内容编码。
    4. 传输编码类型,如果服务器改变了数据在网络上传输的方式,使用了传输编码,它会在响应头中使用Transfer-Encoding字段来说明传输编码的类型。该字段的语法格式如下:Transfer-Encoding:transfer-coding。其中,transfer-coding表示传输编码格式。常见的传输编码及其含义。下面查看响应传输编码类型。其中,Transfer-Encoding字段的值为chunked,表示响应体采用了分块方式传输。此时,Transformer选项卡的Chunked Transfer-Encoding复选框是选中的。如果响应头中没有Transfer-Encoding字段,表示响应体没有进行传输编码。
    5. 服务器信息,通过响应头中的某些字段可以了解到服务器的相关信息。
      1. 服务器类型信息,不同的服务器设备其类型也是不同的,为了能够让客户端辨认自己,通常每个服务器都有自己的标识信息,可能是服务器的名字,也可能是一个服务器注释信息。服务器在返回响应信息时会在响应头中使用Server字段来说明服务器类型。该字段的语法格式如下:Server:(product | comment)。其中,product表示产品类型,comment表示注释信息。下面捕获登录路由器的会话,并查看会话的服务器信息。此时,Server字段值为Router webserver。其中,Router为服务器类型,表示是一个路由器;webserver是注释信息,表示网络服务器。路由器的登录地址为192.168.0.1。
      2. Web应用框架信息,Web应用框架(Web Application Framework)表示网站使用的开发技术和框架,如ASP.NET、PHP等。响应头使用X-Powered-By字段表示Web应用框架信息。该字段的语法格式如下:X-Powered-By:framework。其中,framework表示Web应用框架信息。下面查看网站的Web应用框架信息。其中,X-Powered-By字段值为ASP.NET,表示Web使用的是ASP.NET框架。该框架是Microsoft推出的动态网页开发技术,可用于构建网站、应用程序和服务。
      3. 是否支持资源的部分请求,客户端在向服务器发出请求时,服务器往往返回请求资源的全部内容。有时候,客户端只需要请求资源的部分内容,这需要得到服务器的支持。响应头的Accept-Ranges字段用来显示服务器是否支持客户端只请求资源的一部分。该字段的语法格式如下:Accept-Ranges:acceptable-ranges。其中,acceptable-ranges表示是否支持。当值为bytes时,表示支持对资源的部分请求,请求的范围单位为字节;当值为none时,表示不支持对资源的部分请求。下面查看服务器是否支持客户端对资源的部分请求。由于该字段的值为bytes,说明百度网站支持部分请求。
  5. 响应体,响应体就是服务器回应客户端请求的内容信息。它位于响应头信息之后,并使用一个空行与响应头进行分隔。该部分是客户端要展示的内容,如HTML代码、图片等。

缓存

  1. 缓存(cache)是一种数据备份机制。将客户端要访问的资源放到较为容易访问的位置可以提升访问速度。在HTTP会话中,使用缓存可以减少对源服务器的访问次数,从而减轻资源服务器的负担,提升网站的性能,同时客户端加载网页的速度也会更快。

  2. HTTP缓存机制,HTTP缓存是基于HTTP的浏览器对文件进行请求的缓存机制。该缓存机制决定了浏览器要访问的资源文件是从源服务器中读取还是从缓存中读取。

    1. HTTP缓存工作原理,HTTP缓存分为两种,分别为客户端缓存和服务端缓存。下面依次介绍每种缓存的工作原理。
      1. 客户端缓存,客户端缓存指的是浏览器缓存或本地缓存,该缓存位于客户端,如浏览器。下面是它的工作原理。
        1. 浏览器向源服务器发送请求,表示要请求资源,如图7.1所示。其中,浏览器存在缓存区,此时的缓存区没有任何信息。
        2. 服务器收到请求后进行响应。客户端收到想要的请求资源信息,同时对资源文件进行复制,将资源文件副本存放到自己的缓存区中。此时,缓存区不再为空。
        3. 当浏览器再次请求资源时,浏览器会先到自己的缓存区进行查看。该过程浏览器需要做两件事情:一是查看缓存中是否缓存了资源文件;二是对资源文件进行验证。
        4. 如果缓存区中包含资源文件,并且该资源文件可用。浏览器缓存直接将资源信息返回给浏览器,浏览器不需要从源服务器获取资源信息。
      2. 服务器端缓存,服务器端缓存指的是由反向代理服务器或内容分发网络(Content Delivery Network,CND)进行缓存。该缓存区域位于代理服务器中,下面是它的工作原理。
        1. 浏览器向源服务器发送请求资源,该请求由代理服务器转发给源服务器,这时缓存区为空。
        2. 源服务器收到请求后返回响应信息。其中,代理服务器收到源服务器发来的响应信息,将其转发给浏览器,同时对资源文件进行复制,并将资源文件副本存放到自己的缓存区中。
        3. 当浏览器再次请求资源时,该请求先抵达代理服务器的缓存区。在该过程中,浏览器需要在代理服务器的缓存中查看请求资源文件是否被缓存,并进行验证。
        4. 如果代理服务器缓存区中包含资源文件,并且该资源文件可用,那么代理服务器缓存直接将资源信息返回给浏览器,浏览器不需要从源服务器获取资源信息。
    2. 建立资源缓存信息,当浏览器第一次访问资源时,得到状态码为200的响应信息。该响应信息的头部包含当前资源的描述信息。浏览器在收到响应信息后,会根据这些描述信息选择性地对资源进行复制,并保存到自己的缓存区,为浏览器再次访问资源做准备。下面介绍响应信息包含的相关字段。
      1. 有效期,在缓存区中保存的资源文件副本是有期限制的。如果没有期限限制,那么浏览器每次访问该资源时,都会从缓存中读取资源文件进行使用,不会从源服务器中获取资源信息。这样,访问的资源永远是“旧”资源。即使源服务器对资源进行了更新,浏览器也不会访问到新资源。因此,在响应头信息中包含有效期字段,该字段使用Expire表示,其语法格式如下:Expires:HTTP-date。其中,HTTP-date表示资源在缓存中的到期日期和时间,格式为RFC 7231定义的日期格式,如Expires:Thu,01 Dec 2014 16:00:00 GMT。缓存中将保存资源的有效期。从图中可以看到,在2020年5月27日星期日01:19:59之前,缓存中的GET请求资源是有效的。
      2. 资源在源服务器上的最后修改时间,源服务端在返回资源时,会将该资源的最后更改时间通过Last-Modified字段返回给浏览器。浏览器会将该信息保存到缓存区。Last-Modified字段的语法格式如下:Last-Modified:HTTP-date。其中,HTTP-date表示日期和时间,格式为RFC 7231定义的日期格式。缓存中将保存资源在源服务器上最后的修改时间。从图中可以看到,缓存中GET请求的资源在服务器上最后的修改时间为2016年11月7日星期一07:51:11。
      3. 资源标识符,资源标识符是根据实体内容生成的一段字符串,类似于MD5或SHA1的计算结果。它可以保证每一个资源是唯一的。资源发生变化就会导致资源标识符发生改变。在响应头中,使用ETag字段来表示资源标识符,其语法格式如下:ETag:entity-tag。其中,entity-tag表示资源标识符。缓存中将保存资源标识符。从图中可以看到,缓存中GET请求的资源标识符为50d3-59736b0c0b240。
    3. 根据有效期判断是否使用缓存,当浏览器第二次请求资源时,它不会直接将请求发送给源服务器,而是到缓存中进行查找。缓存中包含资源文件副本,并不代表该资源一定可用,需要做进一步的验证。它会拿有效期与当前的请求时间进行比较,如果请求时间在有效期之前,表示没有过期,浏览器直接使用缓存中的资源。反之,还需要进行下一步的验证,其判断流程。HTTP判断有效期有以下两种方式。
      1. 根据Expires字段判断,Expires字段的值是源服务器返回的一个绝对时间。该信息在会话响应部分Headers选项卡的Cache部分可以查看。
      2. 根据Cache-Control字段判断,由于Expires字段指定的有效期是一个绝对时间,所以当客户端本地时间被修改,源服务器与客户端时间偏差变大以后,就会导致缓存混乱。因此,出现了Cache-Control字段。该字段可以表示一个相对时间,以秒为单位,用数值表示。该信息也是在响应部分Headers选项卡的Cache部分查看,如图7.14所示。Cache-Control字段值为max-age=3600,表示资源的有效期为3600秒。如果同时出现了Expires字段和Cache-Control字段,Cache-Control字段的优先级高于Expires字段。
    4. 基于缓存请求,浏览器第二次进行请求时,在缓存中查找到资源文件副本以后,对有效期进行判断。如果该资源不在有效期内,它会进行下一步验证。该验证实质上是,浏览器基于缓存向源服务器再次发送请求。在请求的头部信息中会加上保存在缓存中的Last-Modified和Etag字段的信息。
      1. 包含Last-Modified字段信息进行请求,浏览器再次向源服务器请求资源时,会在请求头中使用If-Modified-Since字段加上保存在缓存中的Last-Modified字段信息,该字段语法格式如下:If-Modified-Since:HTTP-date。其中,HTTP-date表示资源在服务器上最后的修改时间,也就是缓存中保存的Last-Modified字段值。浏览器再次请求。
      2. 包含Etag字段信息进行请求,浏览器再次向源服务器请求资源时,会在请求头中使用If-None-Match字段包含保存在缓存中的Etag字段信息,该字段语法格式如下:If-None-Match:entity-tag。其中,entity-tag表示资源标识符,也就是缓存中保存的Etag字段值。浏览器再次请求。
    5. 根据If-Modified-Since字段判断是否使用缓存,浏览器发送带有If-Modified-Since字段的请求,其目的是为了要求源服务器验证缓存的资源是否可用。源服务器收到资源请求时,将浏览器传过来If-Modified-Since和资源在服务器上的最后修改时间(Last-Modified)进行比较。如果时间一致,源服务器返回状态码为304的响应信息,但不会返回资源内容。状态码304表示缓存中的资源是最近的、没有被修改过,浏览器可以直接使用。如果时间不一致,返回状态码为200的响应信息,源服务器返回新的资源内容,其判断流程。通过Fiddler判断请求的资源来自于缓存还是源服务器。
      1. 在会话的请求头中,查看If-Modified-Since字段信息。请求头中,If-Modified-Since字段的值为Thu,24 Oct 2019 14:53:27 GMT,该值是浏览器第一次请求时,保存在缓存区的资源最后一次修改的时间;响应头中Last-Modified字段的值为Thu,24 Oct 2019 14:53:27 GMT,该值是服务器返回的资源在服务器上最后一次的修改时间,与缓存中保存的时间相同。因此,该会话是浏览器从缓存中获得的,而不是从源服务器上获得的。在响应行中,也可以看到状态码为304。
      2. 选择一个状态码为200的会话,查看资源的最后修改时间。从图中可以看到,If-Modified-Since字段和Last-Modified字段值不同,表示该资源是由源服务器返回的。
    6. 根据If-None-Match字段判断是否使用缓存,通过If-Modified-Since字段进行判断有时候是不准确的。因为该字段包含的是Last-Modified字段的值,该值只能精确到秒。例如,在1秒内该资源内容被修改过了,那么缓存中的资源就不是最新的了。使用If-Modified-Since字段进行判断会导致浏览器仍然从缓存中读取资源。为了避免此类情况,HTTP使用了If-None-Match进行判断。其判断流程。通过Fiddler判断请求来自缓存还是源服务器。
      1. 在会话的请求头中查看If-None-Match字段信息,在响应头中查看ETag字段信息。从图中可以看到,If-None-Match字段和ETag字段值相同,表示资源没有发生改变。此时,浏览器从缓存中读取资源。在响应行可以看到状态码为304。
      2. 如果同时出现If-None-Match字段和If-Modified-Since字段,源服务器会优先使用资源标识符进行判断。其中,在请求头中包含If-None-Match字段和If-Modified-Since字段,在响应头中只包含ETag字段,表示使用该字段进行判断。该字段值与If-None-Match字段值相同,因此返回304的响应信息。
  3. 内部控制缓存,HTTP提供了一些字段用来设置缓存。浏览器根据这些字段值,决定缓存方式。下面介绍使用的字段及作用。

    1. 禁止缓存,在早期的HTTP/1.0版本中,请求头可以使用Pragma字段。该字段主要用来实现特定的命令,如控制缓存行为。该字段的语法格式如下:Pragma:pragma-directive。其中,pragma-directive表示特定命令。如果特定指令为no-cache,表示禁止缓存。在HTTP/1.1协议中,Pragma:no-cache等同于Cache-Control:no-cache。
    2. 缓存控制方式,在HTTP中,头部使用Cache-Control字段来精确地控制缓存。该字段可以用在请求头中使用,也可以在响应头中使用。
      1. 请求头中的Cache-Control字段,Cache-Control字段在请求头中的语法格式如下:Cache-Control:cache-directive。其中,cache-directive表示缓存请求命令。可用的命令及含义。
      2. 响应头中的Cache-Control字段,Cache-Control字段在响应头中的语法格式如下:Cache-Control :cache-directive。其中,cache-directive表示缓存响应命令。可用的命令及含义。
  4. 外部控制缓存,除了以上介绍的HTTP的字段外,外部的其他环节也会影响到网页的缓存,如用户操作、HTML代码和Fiddler代理。下面介绍外部这些环节对缓存的影响。

    1. 用户操作,用户在浏览器中进行访问操作,也会对缓存产生影响。下面介绍不同操作对缓存产生的影响。
      1. 在地址栏中输入网址并按回车键,在使用浏览器时,用户在地址栏中输入网址后按下Enter键。浏览器直接使用缓存中的资源信息。
      2. 普通刷新F5,在使用浏览器时,用户经常使用F5刷新页面。这时,浏览器向源服务器发送了资源验证请求,以验证缓存中的资源是否可用。
      3. 强制刷新Ctrl+F5,在使用浏览器时,用户也可以使用快捷键Ctrl+F5强制刷新。这时,不管缓存中的资源是否可用,浏览器都不使用,直接向源服务器发送请求,重新获取资源信息。
      4. 使用Fiddler演示用户操作对缓存的影响。
        1. 通过浏览器访问https://www.baidu.com/,Fiddler将捕获到大量的会话。访问该网站时,产生了40个会话。这些会话往往会被浏览器进行缓存。
        2. 在地址栏中再次输入网址,按下Enter键。此时,Fiddler捕获到少量的会话。这里,只产生了3个会话。这是因为在第一次请求时,资源进行了缓存。第二次请求时,直接使用缓存中的资源。
        3. 使用F5进行普通刷新,将产生大量的304类型的会话。
        4. 使用Ctrl+F5强制刷新,将产生大量状态码为200的会话。该些会话都是从源服务器重新获取资源。在会话的头中,查看缓存控制信息。其中,Pragma和Cache-Control的字段均为no-cache。
    2. HTML标签限制,网页的缓存有时候还会受到网页内容的控制和影响。例如,HTML代码通过Meta标签的http-equiv属性参数设置当前网页的缓存方式。下面依次介绍不同参数对缓存的影响。
      1. expires参数,expires参数用来设置网页的有效期。如果过了设置的有效期,网页就会过期,必须重新请求。该参数与HTTP响应头信息中的expires字段的作用一样。expires参数在HTML代码中的形式如下:<meta http-equiv="expires" content="Mon, 12 Nov 2029 02:24:50 GMT">。其中,http-equiv属性的参数为expires,其值为Mon,12 Nov 2029 02:24:50 GMT,表示网页的有效期为2029年11月12日星期一的02:24:50。该作用等同于HTTP响应头中的Expires:Mon,12 Nov 2029 02:24:50 GMT。
      2. pragma参数,pragma参数用来设置禁止浏览器从缓存中读取页面内容。该参数与HTTP头信息中的Pragma字段作用一样。例如,pragma参数在HTML代码中的形式如下:<meta http-equiv="pragma" content="no-cache">。其中,pragma参数的值为no-cache,表示禁用缓存。它的作用等同于HTTP响应头中的Pragma:no-cache。
      3. cache-Control参数,cache-Control参数用来设置缓存控制,该参数与HTTP头信息中的字段作用一样。例如,cache-Control参数在HTML代码中的形式如下:<meta http-equiv="cache-Control" content="no-cache">。其中,cache-Control参数的值为no-cache。表示禁止缓存。它的作用等同于HTTP头中的Cache-Control:no-cache。
    3. Fiddler控制缓存,浏览器向服务器发送请求资源时,Fiddler作为代理服务器,也可以对资源的控制缓存进行设置。
      1. 禁止更新缓存,为了避免网页资源因为时效问题产生过多会话,用户可以设置禁止更新缓存。在Fiddler中,依次选择Rules|Performance|Cache Always Fresh命令,勾选该命令即可。设置后,会话的响应头包含的Cache-Control字段值不会改变。查看对应的值。Cache-Control字段的max-age为60,表示浏览器在60秒内不再检测资源的有效性。
      2. 禁用缓存,为了及时访问最新的资源,或者修改所有可能的会话,就需要禁用缓存。这样,可以避免资源处于时效内,而不产生会话请求。设置禁用缓存功能,需要依次选择Rules| Performance|Disable Caching命令,勾选该命令。查看数据包的缓存字段信息,可以看到字段值被设置为no-cache。
  5. 使用Caching工具分析,为了方便用户查看和分析缓存设置,Fiddler在响应部分提供了单独的Caching选项卡。通过该选项卡,用户可以看到各项缓存设置及其功能。

    1. 分析首次请求的缓存,客户端首次请求资源时,响应信息往往会包含缓存设置字段,如Expires、Last-Modified和ETag。在响应部分中,切换到Caching选项卡,可以查看该会话的缓存设置。为了方便讲解,下面将Caching选项卡中的信息提取出来。这些信息分为以下两部分。

      1. 第一部分显示了缓存的概述信息:HTTP/200 responses are cacheable by default, unless Expires, Pragma, or Cache-Control headers are present and forbid caching.,这部分信息表示,默认情况下HTTP响应是可缓存的,除非使用Expires、Pragma、Cache-Control禁用缓存。

      2. 第二部分显示了响应中缓存的相关字段以及字段值信息:

        # Expires字段信息
        НТТP/1.0 Expires Header is present: Sat. 17 Nov 2029 07:07:42 GMT
        # Cache-Control字段信息
        НТTP/1.1 Cache-Control Header is present: max-age=315360000
                   # mах-age值,表示该资源将在3650天后过期
                   mах-age: This resource will expire in 3650 days.[315360000 sec]
        HTTP/1.1 ETAG Header is present: "1ec5-502264e2ae4co"           # ETAG字段信息
        # Last-Modified字段信息
        HTTP Last-Modified Header is present: Wed. 03 Sen 2014 10:00:27 GMT
        
      3. 响应头包含Expires、Cache-Control、ETAG和Last-Modified字段,并显示了对应的值。其中,Expires字段的版本为HTTP 1.0,其余字段的版本为HTTP 1.1。通过分析这些字段的值,可以了解到该资源设置了有效期,并且没有禁用缓存。因此,该资源是可缓存且可用的。

    2. 验证缓存的有效性,当客户端向服务器进行资源验证时,服务器会再次返回资源的缓存信息。缓存信息同样分为以下两部分。

      1. 第一部分仍然显示了缓存的概述信息:This HTTP/304 response indicates that the existing cached response remains fresh. Cache-lifetime headers on a HTTP/304 response may be used to update he cached response's freshness.,这部分信息表示,缓存是最新的,响应信息将更新资源的有效期。

      2. 第二部分显示了缓存字段信息:

        HTTP/1.0 Expires Header is present: Sat, 23 Jun 2029 06:25:24 GMT
        HTTP/1.1 Cache-Control Header is present: max-age=315360000
                        #过期时间为315360000秒
                        max-age: This resource will expire in 3650 days. [315360000 sec]                + This response's AGE header reports that this response is already 12705575 seconds old
                                                                                                        #该资源存在了12705575秒
        HTTP/1.1 ETAG Header is present: "33ef-58c23f7e0c480" 
        HTTP Last-Modified Header is present: Tue, 25 Jun 2019 11:09:54 GMT
        
      3. 其中,该资源的有效期为315360000秒(3650天),而该资源在缓存中存在了12705575秒,没有过期,缓存仍然可用。

    3. 分析no-cache字段值的缓存,如果Expires或Cache-Control字段的值包含no-cache,这样的资源是不会进行缓存的。其中,Expires和Cache-Control字段的值包含no-cache,表示该资源是不可以缓存的。其中max-age:This resource will expire immediately,表示该资源将立即过期。下面通过Caching选项卡查看缓存信息。提取缓存信息如下:

      HTTP/200 responses are cacheable by default, unless Expires, Pragma, or Cache-Control headers are present and forbid caching.
      HTTP/1.0 Expires Header is present: Wed, 20 Noy 2019 07:07:36 GMT
      Legacy Pragma Header is present: no-cache                                       # Pragma字段
      # Cache-Control字段
      HITTP/1.1 Cache-Control Header is present: max-age=0, no-cache, no-store
              no-cache: This response MUST NOT be reused without successful revalidation with the oriain server
              max-age: This resource will expire immediately. (0 sec) 
      This resnonse contains neither an FTAG nor al ast -Modified time. This will prevent a Conditional Revalidation of this response.
      

Cookie

  1. Cookie是一种HTTP数据存储方式。Cookie数据由服务器生成,并由客户端保存。借助这些数据,服务器建立一种可信赖的机制,用于记录客户端的状态信息,如客户端是否登录、访问过哪些页面等。
  2. 实现Cookie机制,HTTP是一种无状态的协议,客户端与服务器建立连接并传输数据,而数据传输完成后连接就会关闭,当再次传输数据时再建立新的连接。因此,服务器无法通过连接跟踪会话判断客户端上一次做了什么。为了解决这个因素,引入了Cookie机制。
    1. Cookie的工作原理,客户端首次发送请求与Web服务器进行通信。此时,Web服务器对客户端一无所知,不知道其身份。服务器收到请求后做出响应。服务器在响应头中使用Set-Cookie字段来标记客户端的身份,并要求客户端按照指定的规则生成Cookie。客户端收到响应后,按照服务器的指示生成Cookie,并将其存储起来,这样客户端就有自己的身份了。当客户端再次访问该服务器时,会在请求头中使用Cookie字段带上自己的身份信息。服务器收到请求后,会访问请求头中的Cookie信息对用户身份进行验证,发现该客户端之前请求过,并且有自己为客户端定义的身份识别信息。验证通过后,将请求要访问的资源发送给客户端。
    2. 服务器建立Cookie规则,Cookie信息由服务器生成。当客户端访问服务器时,服务器使用Set-Cookie字段,将生成的Cookie信息写入HTTP响应头中。Set-Cookie字段的语法格式如下:Set-Cookie: name:value,其中,name:value是一个名/值对。如果存在多个,使用分号和空格进行分隔。客户端通过Set-Cookie字段设置Cookie信息后,在下一次请求时会将其提交给服务器。验证服务器为客户端建立的Cookie。当客户端首次请求资源时,服务器会在响应头中使用Set-Cookie字段为客户端建立Cookie,查看会话,如图8.5所示。其中,请求头中没有Cookie字段,说明目前客户端是第一次进行访问。响应头包含8个Set-Cookie字段,表示服务器向客户端发送了8个Cookie数据。其中,一个Cookie用来为客户端标识身份。在响应部分切换到Cookies选项卡,可以查看Set-Cookie字段信息,如图8.6所示。其中显示了8个Set-Cookie字段信息,每个Set-Cookie字段信息之间有一个空行。Set-Cookie字段信息的第一行显示了为Cookie提供的字节大小。例如,第一个Set-Cookie提供的Cookie信息大小为129字节。
    3. 客户端传输Cookie,如果在前面的请求中服务器发送了Cookie信息,客户端再次请求该服务器时就会使用Cookie字段,在请求头中向服务器传输此Cookie信息。Cookie字段的语法格式如下:Cookie: name:value,其中,name:value是一个名/值对,可以有多个。这里的名/值对都是由响应头中的Set-Cookie字段所提供的。验证客户端回传Cookie信息。客户端再次请求资源时,会在请求头中包含服务器为其提供的Cookie。其中,请求头中包含Cookie字段。字段的值是上一次访问该服务器提供的。例如,这里的Cookie信息是图8.7中第二个Set-Cookie字段设置的。切换到Cookies选项卡,可以查看请求中包含的Cookie字段信息。如果请求时没有加上Cookie,那么,Cookies选项卡显示This request did not send any cookie data。如果请求中包含Cookie,Cookies选项卡将显示Cookie信息。
  3. 限制Cookie,服务器为客户端传输Cookie信息时,Set-Cookie字段不仅包含信息本身,还可以包含对应的附加信息。这些附加信息用来限制该Cookie的值。下面讲解这些附加信息对Cookie的影响。
    1. 访问不同站点需使用不同的Cookie,在实际应用中,客户端往往存储了成百上千个Cookie。在访问服务器时,客户端不会将每个Cookie都发送给服务器。客户端只会发送与服务器对应的Cookie数据给该服务器。例如,www.baidu.com为客户端定义的Cookie会被发送给www.baidu.com,而不会发送给www.qq.com。所以访问不同站点会使用不同的Cookie。下面是具体的工作流程。当浏览器首次访问不同的站点时,每个站点都会为浏览器定义一个特有的Cookie,浏览器会将这些Cookie都存储起来;当再次访问站点B时,它只会取出站点B为自己定义的Cookie,然后发送给站点B,而不会取出其他站点定义的Cookie。
    2. Cookie的有效期,因为客户端的状态会随着时间的变化而改变,所以服务器在定义Cookie时都会为其指定一个有效期。根据不同有效期,Cookie分为不同类型。下面讲解Cookie的分类以及有效期的指定方式。
      1. Cookie的类型,根据有效期的时间长短,Cookie可以分为两类,分别为会话Cookie和持久Cookie。会话Cookie是一种临时Cookie,当用户退出浏览器时,会话Cookie就被删除了;持久Cookie的生存时间更长一些,它被存储在硬盘上,即使退出浏览器,该Cookie仍然存在,直到超过设定的有效期。
      2. Set-Cookie字段的Expires属性,在HTTP中,Set-Cookie字段可以用Expires属性直接设定Cookie的有效期,其语法格式如下:Set-Cookie: name:value; Expires= Date,其中,Date为Cookie的有效期,格式为RFC 7231定义的日期格式。例如,expires=Sat,16-Nov-2019 01:57:30 GMT表示该Cookie值在2019年11月16日1点57分30秒之前有效。如果Set-Cookie中没有设置Expires属性,则表示该Cookie是一个会话Cookie。通过Expires查看客户端Cookie的有效期。其中,expires的值为Mon,15-Nov-2021 01:42:30 GMT,表示该Cookie值在2021年11月15日01:42:30之前有效。
      3. Set-Cookie字段的Max-Age属性,Set-Cookie字段还可以使用Max-Age属性设定Cookie的有效期。其语法格式如下:Set-Cookie: name:value; Max-Age= second,其中,second表示Cookie的寿命。如果second为正整数X,则表示Cookie经过X秒后失效;如果second为0或-1,则表示Cookie为一个会话Cookie,只要退出浏览器就失效。通过Max-Age查看客户端Cookie的有效期。其中,Max-Age的值为15552000,表示客户端的Cookie将在15552000秒(180天)后失效,所以该Cookie是一个持久Cookie。
    3. Cookie的发送范围,访问不同的站点要使用不同的Cookie。那么客户端如何正确地将Cookie发送到正确的地方呢?这其实与Cookie的作用范围有关。下面介绍如何使用Set-Cookie设置Cookie的作用范围。
      1. Set-Cookie字段的domain属性,Set-Cookie字段使用domain属性指定哪些站点可以使用这个Cookie值,其语法格式如下:Set-Cookie: name:value; domain=Domain,其中,domain用来表示Cookie所在的域,默认为请求的地址。查看domain的值,判断客户端的Cookie可以发送到哪些范围。其中,Set-Cookie字段指定了domain=.baidu.com,表示客户端可以将Cookie发送给以.baidu.com结尾的所有站点。例如,客户端可以将该Cookie值发送给zw.baidu.com和ztalk.baijia.baidu.com站点,但是不能发送给www.qq.com站点。
      2. Set-Cookie字段中的path属性,Set-Cookie字段使用path属性指定客户端可以将Cookie发送到哪个路径下,其语法格式如下:Set-Cookie: name:value; path=Path,其中,path用来指定请求该路径下的资源才可以发送该Cookie值,默认为根目录(/)。查看path的值,判断客户端的Cookie可以发送到哪些路径下的资源。选中会话请求网址的前半部分信息为https://api.cpcwe.com/tipsapi/。该网址的域名为api.cpcwe.com。Set-Cookie字段指定path=/,表示客户端的Cookie可以发送到api.cpcwe.com域名下的所有资源,而不会发送到其他站点上。假如www.XXX.com服务器为Cookie定义了两个path值,分别为path=/test/和parh=/test/a/,则对应的Cookie分别为Cookie:ID=23456和Cookie:ID=56789。如果客户端使用Cookie:ID=23456进行请求,那么Cookie可以发送到www.XXX.com/test/下的所有资源。如果客户端使用Cookie:ID=56789进行请求,那么它的发送范围将发生变化。客户端不会在请求www.XXX.com/test/b资源时发送Cookie:ID=56789。
      3. Set-Cookie字段中的domain与path,在实际应用中,Set-Cookie字段往往与domain和path组合使用。会话请求中,URL前半部分信息为https://d.turn.com/r/dd/id/,其中的域名为d.turn.com,要请求的资源信息位于/r/dd/id目录下。在响应头的Set-Cookie中,Domain=.turn.com表示客户端的Cookie可以发送到以.turn.com结尾的域名对应的站点。
    4. 安全防护,为了保证Cookie的数据传输和使用安全,HTTP还规定了Cookie安全防护措施,如必须使用HTTPS进行加密传输或访问限制。下面简要介绍安全防护措施。
      1. Set-Cookie字段的secure属性,由于HTTP是明文传输数据,所以存在数据被嗅探的风险。为了保护Cookie数据的安全,Set-Cookie字段使用secure属性限制Cookie是否必须使用加密传输,其语法格式如下:Set-Cookie: name:value; secure=Bool,其中,Bool是一个布尔值。当它的值为True时,表示只在使用HTTPS加密连接时才传输Cookie。当它的值为False时,表示可以在HTTP下进行传输。默认值为False。
      2. Set-Cookie字段中的httponly,在实际应用中,不仅客户端的请求可以读取Cookie,而且客户端的JavaScript代码也可以读取Cookie。为了避免Cookie被JavaScript代码滥用,Set-Cookie字段使用httponly属性限制JavaScript代码对Cookie的访问。该属性的语法格式如下:Set-Cookie: name:value; httponly,其中,该属性可以直接被使用。如果使用,表示禁止JavaScript代码读取该Cookie值;否则,表示不限制。查看Set-Cookie字段对Cookie的设置,判断客户端Cookie的安全性。其中,Set-Cookie字段包含httponly属性,表示该Cookie值禁止JavaScript代码的访问。

常见的会话分析

  1. 当客户端访问网站或网页时,Fiddler会捕获到很多会话。根据响应体中包含的内容类型的不同,这些会话可以分为音乐会话、视频会话、图片会话和文本会话等。Fiddler为不同类型的会话提供相应的分析工具。
  2. 文本会话,网页中往往会包含大量的文本信息,如HTML文本信息和CSS文本信息等。客户端一旦访问包含这类信息的资源,Fiddler就会捕获到这类会话。Fiddler提供了对应的选项卡,用于查看这类文本信息。
    1. 纯文本视图,TextView选项卡用于查看纯文本内容类型的资源。查看访问网页的纯文本内容信息:捕获访问https://email.163.com/的会话。在请求和响应部分中选择TextView选项卡,查看纯文本内容信息,如图9.1所示。请求部分的TextView选项卡没有任何信息,这是因为该会话的请求方式为GET,没有提交纯文本内容。响应部分的TextView选项卡显示乱码,这是由于会话进行了编码,需要进行解码;单击黄色提示信息Response body is encoded.Click to decode进行解码。此时,该选项卡以纯文本形式显示内容信息。其中,以HTML代码的形式显示网页的内容信息,如网页的标题为“网易免费邮箱-中国第一大电子邮件服务商”;如果会话的请求方式为POST,并且提交了纯文本内容信息,请求部分的TextView选项卡将显示对应的纯文本格式信息。
    2. 代码视图,在捕获文本类信息时,Fiddler会自动判断语法类型,对HTML、CSS和JavaScript代码进行语法高亮标记,并在SyntaxView选项卡中显示。通过该选项卡,用户可以直观地查看代码结构。
    3. 网页视图,对于网页内容,WebView选项卡直接显示渲染后的效果,而不是原始的HTML代码。
  3. 图片会话,浏览器访问包含图片的网页时会产生图片类型的会话。在Fiddler中,支持以图片的形式显示响应内容。用户可以通过响应部分中的ImageView选项卡进行查看。该选项卡既支持常见的Web图片格式(包括JPEG、PNG、GIF),也支持一些不常见的图片格式(如游标、位图、EMF/WMF和TIFF)。
    1. 查看图片,启动Fiddler,当客户端打开百度首页查找图片(如小老虎图片)时,页面。Fiddler就会捕获到客户端浏览图片的会话。Web Session列表中可以看到图片类型的会话。选择图片类型的会话,查看客户端浏览过的图片。本例选择的是第57个会话。在ImageView选项卡中可以看到,是一张老虎的图片,正是客户端浏览网页图片中的一张图片。我们依次选择其他图片的会话,以同样的方式查看,看到的图片同样也是图9.6中出现的图片。
      1. 调整缩放模式,在ImageView选项卡中的最左侧有一个面板框,其中显示的是当前选中图片的信息,包括其大小(以字节数表示)、像素尺寸及文件格式。在面板框的底部是一个下拉列表,可以控制图像的缩放。下拉列表中的各项及其功能如下:No scaling图片以原始大小显示、Autoshrink自动缩小尺寸比,显示区域大的图片、Scale to fit按显示区域大小自适应调整,将大图缩小,将小图放大。
      2. 修改背景色,查看的图片的背景颜色默认为淡蓝色。如果图片的颜色和背影颜色相同,或者比较接近,又或者图片比较透明,则查看图片时会受到背景颜色的干扰,不易查看。可以改变图片的背景颜色,从而方便查看。具体方法是右击该图片,选择Set Workspace Color…命令,弹出“颜色”对话框。合适的颜色,然后单击“确定”按钮,查看会话视图。
      3. 全屏缩放,可以很明显地看到图片。如果Fiddler中显示的图片比较小,则可以双击该图片,打开一个全屏视图。在全屏视图中,可以对图片进行如表9.1所示的操作。
    2. 复制图片信息,查看图片会话时,用户可以以多种方式复制图片资源。右击图片,弹出快捷菜单。在快捷菜单中选择以下命令,可以对图片进行复制操作。Copy as Bitmap复制图片,可以将图片粘贴到其他图片编辑器中、Copy as DataURI复制图片链接、Save to Desktop将图片保存到桌面上。
    3. 扩展编辑功能,除了对图片的复制操作之外,Fiddler还提供了其他扩展编辑功能,可以进一步操作图片。在图9.11中弹出的快捷菜单中选择Tools命令,再次弹出子菜单。
      1. 提取图片,选择PNGDistill命令,将调用Fiddler内置的PNGDistill.exe工具,对PNG类型的图片进行优化,如移除元数据、提升压缩比例。选择该命令后,将显示优化信息,并提示是否保存新的PNG图片。这里选择保存该图片文件。输入Y,并按回车键,将提示输入保存后的文件名称,如图9.14所示。优化后的图片默认保存在C:\Users\Administrator\AppData\Local\Programs\Fiddler目录中。输入文件名称,然后按回车键即可保存图片。在该目录下找到图片并查看。
      2. 修改图片质量,保存图片时,可以使用Explore Quality命令修改图片的质量,来改变图片的清晰度。选择该命令后,将弹出Image Quality Explorer对话框。如果向左拖动滑块,可以降低图片质量,减小图片的大小。初始图片大小为13295字节。此时,默认图片质量为最佳,滑块位置在最右侧。向左拖动滑块。此时,图片质量降低,变得比较模糊了。图片转化为了JPEG格式,质量系数为5,图片大小为1999字节。单击Save to File按钮,可以保存修改后的图片。单击Save New Response按钮,将在Sessions列表中创建一个会话,如图9.18所示。该会话没有请求和响应信息,只是为修改后的图片创建了一个会话,供后期调试使用。
  4. 视频会话,当在浏览器中播放视频时,就会产生视频类型会话。在Fiddler中,我们可以通过WebView选项卡查看,该选项卡位于会话的Inspectors的响应中。Fiddler支持查看Web浏览器获取到的视频,通过它可以快速预览某个给定响应在浏览器中是如何显示的。
    1. 如果要查看视频数据,需要用户预先通过Tools|Options命令打开Options对话框,然后勾选Automatically stream &video复选框。首先启动Fiddler,当客户端在线观看视频(比如通过360影视)时,选择要看的视频(比如《他来了,请闭眼》)。开始播放视频,视频一般带有广告,查看视频的广告。
    2. 客户端看广告时,Fiddler就可以捕获这些广告。查看捕获的会话。Web Session列表中可以看到视频类型的会话,选择视频类型的会话,查看客户端浏览过的视频。本例选择的是第150个会话,在响应中的WebView选项卡中可以看到一个浅蓝色的方块。该方块就是视频广告文件。单击该文件即可播放视频。会话的视频只播放15s,实际的视频广告都在15s以上。
    3. 上一个视频会话的广告播放完以后,继续播放,接下来的广告就被下一个视频会话捕获到了。查看捕获的视频会话视图。可以看到选择的是第158个会话,使用同样的方法查看视图。我们在预览这些视频文件时,每次都得单击才能播放,比较麻烦。在选项卡的右上角有一个AutoPlay复选框。当选中该复选框时,媒体文件在加载后会自动开始回放,结果。
  5. 音乐会话,当在浏览器中播放音乐时,就会产生音乐类型的会话,在Fiddler中,同样可以通过WebView选项卡进行查看。启动Fiddler,当用户在百度首页上输入“音乐”,即可在线试听音乐。
    1. 如果要查看音乐数据,需要用户预先通过Tools|Options命令打开Options对话框,然后勾选Automatically stream & video复选框。当用户选择好音乐后,单击播放按钮就可以听音乐了。用户可以通过控制键切换歌曲,试听下一首。当用户试听音乐时,Fiddler可以捕获到试听音乐的会话,捕获到的会话。从音乐会话的视图中可以看到,客户端试听的音乐是一首完整的歌曲。我们在预览这些音频文件时,和浏览视频文件一样,每次都得单击后才能播放,比较麻烦。我们同样可以勾选AutoPlay复选框。当选中该复选框时,媒体文件在加载后会自动开始播放。
  6. JSON会话,客户端通过浏览器访问服务器,服务器返回响应后,浏览器分析响应中的HTML。如果其中使用AJAX方式请求数据,往往会产生JSON格式的会话。在Fiddler中,我们可以通过JSON选项卡进行查看。如果Fiddler捕获的会话请求和响应体是JSON格式,那么JSON选项卡会把选中的会话请求或响应体解释成JSON格式的字符串,以树形视图显示JSON对象节点。如果不是JSON格式,树形图会是空的。那么什么是JSON呢?下面将对JSON及对会话的请求体和响应体分别进行介绍。
    1. JSON的概念,JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。JSON采用完全独立于语言的文本格式,这些特性使JSON成为理想的数据交换语言,易于阅读和编写,同时也易于机器解析和生成。
      1. JSON的结构,JSON的结构有两种,简单地说就是JavaScript中的对象和数组。通过这两种结构可以表示各种复杂的结构。下面分别介绍对象和数组。
        1. 对象:在JavaScript中表示用花括号({})括起来的内容,数据结构为{key:value,key:value,…}的键-值对。在面向对象的语言中,key为对象的属性,value为对应的属性值。所以,很容易理解,取值方法为对象key获取属性值,这个属性值的类型可以是数字、字符串、数组、对象等。
        2. 数组:在JavaScript中是用中括号([])括起来的内容,数据结构为[“java”,“javascript”,“vb”,…],取值方式和所有语言中一样,使用索引获取。字段值的类型可以是数字、字符串、数组、对象等。
      2. JSON的语法,JSON的语法规则是JavaScript对象表示语法的子集:
        1. 数据在键-值对中;
        2. 数据由逗号分隔;
        3. 花括号保存对象;
        4. 方括号保存数组。
      3. JSON的值,JSON的值如下:
        1. 数字(整数或浮点数);
        2. 字符串(在双引号中);
        3. 逻辑值(true或false);
        4. 数组(在方括号中);
        5. 对象(在花括号中);
        6. null。
      4. JSON名称-值对,简单地说,JSON可以将JavaScript对象中表示的一组数据转换为字符串,然后就可以在函数之间轻松地传递这个字符串,或者在异步应用程序中将字符串从Web客户端传递给服务器端程序。这个字符串看起来有点古怪,但是JavaScript很容易解释它,而且JSON可以表示比“名称-值对”更复杂的结构。例如,可以表示数组和复杂的对象,而不仅仅是键和值的简单列表。按照最简单的形式,可以用下面的JSON表示“名称-值对”:{"firstName" : "Brett"},上面这个示例是最基本的,而且实际上比等效的纯文本“名称-值对”占用更多的空间:firstName=Brett,但是,当将多个“名称-值对”串在一起时,JSON就会体现出它的价值了。首先,可以创建包含多个“名称-值对”的记录,比如:{"firstName": "Brett", "lastName":"McLaughlin", "email":"aaaa"},从语法方面来看,这与“名称-值对”相比并没有很大的优势,但是在这种情况下JSON更容易使用,而且可读性更好。例如,它明确地表示以上3个值都是同一记录的一部分,花括号使这些值有了某种联系。
    2. 查看请求体的JSON,会话的请求方式为GET时,是没有请求体的,因此需要选择其他请求方式的会话(比如POST)。
      1. 选中请求方式为POST的会话,依次单击Inspectors|Raw查看会话的完整请求内容。切换到TextView选项卡,只查看请求体,该选项卡支持以文本形式查看请求体。显示的内容。可以看到选中会话的请求体,最上面的一行是uin=1304977864。查看请求体的JSON。切换到JSON选项卡,可以看到显示的JSON对象节点,界面。从JSON选项卡中可以看到JSON=uin,说明将会话的请求体解释成了JSON格式的字符串,显示的对象节点为uin。
    3. 查看响应体的JSON,我们查看会话的响应体时,有时会发现响应体是一长串字符,看起来很乱。下面是查看会话的响应体的方法。
      1. 选中脚本文件的会话或JSON格式的会话,依次单击Inspectors|Raw查看会话的完整响应。切换到TextView选项卡,只查看响应体。可以看出,图9.34中的响应体仍然是一堆字符,看起来很乱。在第二行我们可以看到“cid”:“1”,“oid”:“1”,“soid”:“Usa4t3lUVgCpIwjibgAVu84/AX/i”等类似的字符串。这是串在一起的JSON“名称-值对”结构。JSON Inspector会将响应体中这些JSON格式的字符串,显示为树状视图形式的JSON对象节点。
      2. 查看响应体的JSON。切换到JSON选项卡,可以看到显示的JSON对象节点,界面。可以看到树状的JSON对象节点,每一组都是树状显示的JSON对象,并且都是按照字母顺序显示的。我们可以看到,图9.36中的“oid”:“1”在JSON选项卡中显示为oid=1。
      3. 由于是按字母顺序显示的,我们可以依次找到“oid”、“1”和“soid”:“Usa4t3lUVgCpIw jibgAVu84/AX/i”在JSON选项卡中的视图。能更清晰地看到响应体的JSON字符串了。JSON选项卡的下方有两个按钮(见图9.35),Expand All按钮会展开树的所有节点;Collapse按钮会折叠所有节点。如果请求体包含的节点数少于2000,JSON树会自动展开。
      4. 对于不同的会话,响应体是不同的,查看到的JSON的“名称-值对”也是不同的。有些“名称-值对”在响应体中不会以字符的形式出现。响应体中可以看到类似于“pub_title”:“\u8d70\u592a\u884c\u770b\u5bcc\u5c97\u955c\u5934\u4e0d\u8db3\u4ee5\u88c5\u4e0b\u773c\u524d\u7684\u7f8e\u666f”的字符串。这样的字符串在JSON选项卡中显示为文字。查看该字符串对应的JSON对象节点,结果。可以看到,对象节点名称pub_title的值对为“走太行看富岗镜头不足以装下眼前的美景”。有时,在查看会话响应体的时候会发现响应体是一些乱码。可以看到,会话使用了gzip的压缩方式,压缩了响应对象,响应体是一些乱码。
        1. 切换到TextView选项卡。虽然会话的响应体使用了压缩方式,但JSON Inspector可以渲染数据,即使响应体是压缩格式或使用了HTTP Chunked编码,也可以显示数据内容。切换到JSON选项卡。对响应体解码,单击响应体上方黄色栏中的Response body is encoded.Click to decode,或者右击会话,在弹出的快捷菜单中选择Decode Selected Sessions命令,完成操作后,再次查看会话的响应体。切换到TextView选项卡,查看结果。可以看到解压后的会话对应的响应体了。
  7. XML会话,客户端通过浏览器访问服务器,服务器返回响应后,浏览器分析响应中的HTML,如果引用了XML文件,就会产生XML格式的会话。在Fiddler中,我们可以通过XML选项卡进行查看。Fiddler捕获的会话请求和响应体是XML格式,那么XML选项卡会把选中的会话请求和响应体解释成XML格式的字符串,并显示XML文档节点的树形图。如果会话的请求和响应体不是XML格式,树形图会是空的。
    1. XML是可扩展标记语言标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。查看XML格式的会话与查看JSON格式的会话请求和响应体的方法类似,这里以查看响应体为例,简单地做个介绍。打开捕获文件,选择XML格式的会话,依次单击Inspectors|Raw选项卡查看会话的完整响应。切换到TextView选项卡只查看响应体。切换到XML选项卡,查看把会话解释成XML格式的字符串的树形图。可以看到,会话的响应体是以树状图显示的,内容没有变化,分层比较明显也便于观察。
    2. 在XML选项卡的下方同样也有两个按钮,Expand All按钮会展开树的所有节点;Collapse按钮会折叠所有节点。如果请求体包含的节点数少于2000,XML树会自动展开。如果选择的会话使用了gzip的压缩方式,压缩了响应对象,则响应体是一堆乱码。查看会话的完整响应体。虽然会话的响应体使用了压缩方式,但XML Inspector同样可以渲染数据,即使响应体是压缩格式或使用了HTTP Chunked编码,也可以显示数据内容。切换到XML选项卡。对响应体解码,单击响应体上方黄色栏中的Response body is encoded.Click to decode,或者右击会话,在弹出的快捷菜单中选择Decode Selected Sessions命令,完成操作后,再次查看会话的响应体。解压后,我们再次看到了会话的响应体。
  8. 认证信息,如果在HTTP访问中,用户使用了上游代理,或其他用于HTTP身份验证的凭证,那么在会话的头部将会包含这些身份认证信息。我们可以通过Auth选项卡快速查看这些信息。

修改会话

  1. Fiddler不仅可以分析捕获到的会话,而且还具备一个更强大的功能——修改会话。用户可以设置会话断点,并对会话的请求和响应进行修改。因此无论是对开发人员,还是对测试人员来说,Fiddler都是非常有用的工具。
  2. 会话断点,在设置断点之前,首先回顾一下Fiddler的工作原理。Fiddler的核心是代理Web服务器。它使用代理地址127.0.0.1和端口8888。Fiddler位于用户与Web服务器之间,由它转发请求与响应。Fiddler作为代理服务器,在客户端和服务器之间传递客户端的请求和服务器的响应。会话断点根据添加的位置,可以分为请求断点和响应断点。
    1. 请求断点,会话在Fiddler接收到客户端的请求时断开,请求断点的原理。
    2. 响应断点,会话在Fiddler接收到服务器响应时断开,响应断点的原理。
  3. 设置请求断点,Fiddler可以把客户端的请求拦截下来,修改后再发送给服务器。这就需要设置会话的请求断点。设置请求断点的方法有三种。用户可以在Fiddler中通过Rules|Automatic Breakpoints命令选择断点,也可以在命令行中输入命令完成断点的设置,还可以根据过滤器中的功能来设置断点。下面介绍设置请求断点的具体方法。
    1. 通过菜单栏设置请求断点,使用菜单栏方法设置请求断点会中断所有会话的请求,有一定的局限性。设置方法如下:启动Fiddler,在菜单栏中依次选择Rules|Automatic Breakpoints|Before Requests命令。当客户端访问网站时,Fiddler会中断所有的请求会话。可以看到,捕获的会话都在请求时被中断,这表示客户端发出的请求没有得到响应,也没有发送给服务器。请求被中断的会话是没有响应体的,因此客户端访问的网站都没有成功。例如,访问百度首页也将会被中断。在浏览器中可以看到客户端没有成功访问网站。可以看到,客户端请求的baidu.com网站一直处于加载状态,客户端没能成功地访问网站。如果想取消请求断点,在菜单栏中依次选择Rules|Automatic Breakpoints|Disabled命令即可。
    2. 通过命令行设置请求断点,使用命令行方法设置请求断点是针对特定请求进行设置的。不同的请求,设置方法也不同。
      1. 指定会话URL设置请求断点,如果只设置URL中包含www.baidu.com会话的请求断点,则需要在命令行中输入bpu www.baidu.com,如图10.6所示。按回车键后命令消失,表示命令生效。在浏览器中访问其他网站和www.baidu.com,查看捕获到的会话。可以看到访问百度首页的会话请求被中断,客户端没有收到响应,会话无响应体。而访问其他网站(如www.taobao.com)的会话的请求没有被中断,可以成功访问。
      2. 指定会话请求方式,设置请求断点,会话的请求方式有多种,我们可以设置特定请求方式的断点,如设置请求方式为GET的断点。在命令行中输入bpv GET或bpm GET,按回车键,通过浏览器访问网站,查看捕获的会话。可以看到许多会话的请求被中断。选择任意请求中断的会话,查看请求行信息,可以看到请求方式都为GET,说明请求方式为GET的会话请求都被中断了。选择请求未中断的会话,可以在请求行看到请求方式是其他方式。如果想清除断点,在命令行中直接输入不加参数的断点命令(如bpu、bpv/bpm)即可。
    3. 过过滤器设置请求断点,启动Fiddler,选择Filters选项卡,勾选Use Filters复选框,找到设置断点的区域。从图中的设置断点区域可以看到有4个选项可用于对会话设置断点,如支持对包含给定属性的请求和响应设置断点。下面介绍这些选项的含义。
      1. Break request on POST:对所有POST请求设置断点。
      2. Break request on GET with query string:对所有请求方法为GET且URL中包含给定查询字符串的请求设置断点。
      3. Break on XMLHttpRequest:对所有能够确定是通过XMLHttpRequest对象发送的请求设置断点。
      4. Break response on Content-Type:对所有响应头Content-Type中包含指定文本的响应设置响应断点。
      5. 我们可以根据这些选项的功能设置断点。
      6. 勾选Break request on GET with query string复选框,查看捕获到的会话。可以看到请求被中断的会话,选择该会话,查看会话的请求行,可以看到请求方法为GET。查看会话的URL,可以看到一些字符串。这说明请求方法为GET,且URL中包含给定查询字符串的请求被中断了。选择未被中断的会话,查看会话的URL和请求方法。可以看到,虽然访问百度首页的请求方法也为GET方法,但由于URL中没有请求字符串,所以会话没有被中断。URL字符串代表在URL中包含特殊字符,因为有些符号在URL中是不能直接传递的。如果要在URL中传递这些特殊符号,那么就要使用它们的编码了。常见的特殊符号有?、&、%、#等。
  4. 设置响应断点,Fiddler可以把服务器的响应拦截下来进行修改后再发送给客户端,这就需要设置会话的响应断点。设置响应断点的方法也有三种。用户可以通过Fiddler的Rules|Automatic Breakpoints菜单命令选择断点的设置方式,也可以通过在命令行中输入命令来完成断点的设置,还可以根据过滤器里的功能来设置断点。
    1. 通过菜单栏设置响应断点,使用菜单栏方法设置响应断点会中断所有会话的响应,所以也具有一定的局限性。设置方法为:启动Fiddler,在菜单栏中依次选择Rules|Automatic Breakpoints|After Responses命令,当客户端访问网站时,Fiddler会中断所有的响应会话。可以看到,捕获的会话都在响应时被中断,这表示服务器的响应没有发送给客户端。因此,客户端访问的网站同样都没有成功,如图中访问的www.baidu.com、www.taobao.com、www.qq.com等。回到浏览器中可以看到客户端没有成功访问网站。如果想取消响应断点,则在菜单栏中依次选择Rules|Automatic Breakpoints|Disabled命令即可。
    2. 通过命令行设置响应断点,使用命令行方法可以针对特定响应进行设置。不同的请求其设置方法也不同。
      1. 指定会话URL设置响应断点,如果只设置针对URL中包含www.baidu.com会话的响应断点,需要在命令行中输入bpafter www.baidu.com。按回车键后命令消失,表示命令生效。在浏览器中访问其他网站和www.baidu.com,查看捕获到的会话。可以看到,访问百度首页的会话响应被中断。和请求断点不同的是,响应断点的会话是有响应体的。而访问其他网站(如www.taobao.com)的会话的响应却没有被中断,可以成功访问。
      2. 指定会话响应状态码设置响应断点,会话的响应状态有很多种,用户可以根据会话的响应状态码来设置响应断点。例如,设置状态码为200的会话响应断点。在命令行中输入bps 200,按回车键后通过浏览器访问网站,查看捕获到的会话。可以看到,许多会话响应被中断。在Web Session列表的Result列中也不会看到状态码200。选择任意响应中断的会话,查看响应行信息可以看到,响应的状态码均为200,说明响应状态码为200的会话响应都被中断了。如果想清除断点,则在命令行直接输入不加参数的断点命令(bps、bpafter)即可。
    3. 通过过滤器设置响应断点,通过过滤器可以根据会话类型设置会话的响应断点。例如,设置图片类型会话的响应断点,图片类型会话的Content-Type中包含图片格式(如JPG、GIF、JPEG、PNG等)字样。这里以JPEG图片为例设置图片类型会话的响应断点。下面是设置的方法。
      1. 启动Fiddler,选择Filters选项卡,勾选Use Filters复选框,并在设置断点的区域中勾选Break response on Content-Type复选框,在后面的文本框中输入jpeg。
      2. 浏览网页。如果网页中包含的图片为JPEG格式,将不会显示该图片,查看浏览的结果。可以看到,没有出现背景图片。这是由于Fiddler已经为背景图片(JPEG类型)的会话设置了响应断点,所以在浏览器中不会返回该类型的图片。
      3. 返回Fiddler中查看响应断点的会话。可以看到被中断的会话。选择该会话,在会话的ImageView选项卡中可以看到该会话的视图是一张图片,图片格式也为JPEG。这说明JPEG格式的会话响应已被成功中断。在Web Session列表的Content-Type列中不会显示被中断的会话类型。
      4. 取消断点后重新访问刚才的网页,此时可以看到背景图片。
  5. 修改会话请求,客户端通过浏览器发送请求给服务器可以得到相应的网站或网页。Fiddler可以中断客户端的请求,并对请求进行修改,从而影响客户端后期得到的响应。
    1. 修改客户端请求的HOST,HOST是服务器的主机名。通过修改HOST,可以使客户端原本想访问的网站或网页变成其他主机的网站或网页。这里以访问www.baidu.com为例,通过修改HOST返回www.taobao.com主页。下面是具体的操作方法。
      1. 手动设置断点修改会话的HOST
        1. 启动Fiddler,在浏览器中输入www.baidu.com,成功打开百度首页。
        2. 查看访问百度首页的会话。可以看到访问百度首页的会话,并且会话的请求背景颜色为浅绿色,表示不能对会话的请求进行编辑。
        3. 右击会话,依次选择Replay|Reissue and Edit命令,或选中会话后使用快捷键E使会话的请求中断。可以看到,对会话进行操作后会重新生成新的会话,来代替请求中断的会话。此时,会话的背景颜色由浅绿色变成白色,用户可以对会话的请求进行编辑修改。同时,会话的请求和响应之间多出来红色的一栏,用于再次发送会话请求。
        4. 单击会话请求中的黄色[Raw]按钮,查看会话的原始请求。修改请求的HOST,把www.baidu.com改为www.taobao.com。单击Save按钮,窗口关闭,返回Fiddler,单击红色栏中的Run to Completion按钮查看会话。可以看到,会话的主机名由www.baidu.com变成了www.taobao.com。会话的请求背景颜色又变回浅绿色。
        5. 单击请求上方的Browse按钮,或者右击该会话,依次选择Replay|Revisit in IE命令,将会在另一个浏览器窗口中打开修改后的界面。
      2. 自动设置断点修改会话的HOST
        1. 启动Fiddler,设置百度首页请求断点,在命令行输入bpu www.baidu.com。此时,访问百度首页,无法显示网页。查看访问百度首页的会话。
        2. 这时,设置了请求断点的会话处于编辑修改状态。单击会话请求中的黄色[Raw]按钮,将请求中的HOST由www.baidu.com改为www.taobao.com。单击Save按钮,然后单击红色栏中的Run to Completion按钮,重新请求会话,此时请求的是被修改过的www.taobao.com。返回浏览器,可以看到淘宝首页。
      3. 不需要设置断点修改请求的HOST,这是一种替换的方法,通过urlreplace HOST1 HOST2命令替换请求的HOST,使得要发送到的HOST1的请求被转发到HOST2上。例如,客户端要访问www.baidu.com,最后访问的是www.qq.com。下面是具体的设置方法。
        1. 启动Fiddler,在命令行输入urlreplace www.baidu.com www.qq.com命令。启动浏览器。单击“百度”链接,会看到访问的百度首页变成了腾讯首页。
    2. 修改客户端搜索的内容,通过修改客户端搜索的内容,可以使客户端无法得到需要的内容,而变成其他搜索结果。例如,客户端想要搜索笑话,通过对该会话设置请求断点,可以对搜索内容进行修改,使客户端搜索到的不是笑话,而是其他内容(如诗歌)。下面介绍具体的操作方法。
      1. 启动Fiddler,在浏览器中通过百度搜索笑话。Fiddler会捕获客户端搜索笑话大全的会话,查看该会话。选中会话的Inspectors选项卡的WebForms选项卡,wd变量保存着客户端的搜索内容“笑话大全”。右击该会话,将会话的URL复制出来。
      2. 在命令行中输入bpu URL(URL为刚才复制的网址)。按回车键,设置断点命令生效。当客户端再次访问该URL时会话的请求就会被中断,捕获到的会话。将变量wd的值“笑话大全”改成“经典笑话”,然后单击红色栏中的Run to Completion按钮,客户端搜索“笑话大全”时就变成搜索“经典笑话”了。
    3. 修改请求标题和内容不符,通过修改客户端请求的标题,可以使客户端得到的内容和标题不一致。例如,客户端想搜索小狗图片,就会输入“小狗图片”,搜索成功后得到小狗图片。对该会话设置请求断点后就可以对输入的标题(小狗图片)进行修改。当客户端再次浏览该图片的网址时,就可以看到搜索的标题与内容不符。下面是具体的操作方法。
      1. 启动Fiddler,通过浏览器浏览图片(如小狗图片)。Fiddler会捕获到客户端发出的搜索“小狗图片”的会话,查看该会话的内容。找到搜索“小狗图片”的会话后,可以看到在该会话的Inspectors选项卡下的WebForms选项卡中,变量wd的值为“小狗图片”,变量hsug的值也为“小狗图片”。
      2. 在浏览器中任意选择一张图片,单击查看单张图片。Fiddler仍然会捕获到该操作的会话,查看该会话的内容。第63个会话不是图片类型的会话。在会话的Inspectors选项卡下的Web-Forms选项卡中,可以看到变量word的值为乱码。变量ori_query的值为“小狗图片”,右击该会话,将会话的URL复制出来。
      3. 在命令行中输入bpu URL(URL为复制的会话URL)。按回车键,设置断点命令生效。当客户端再次访问该URL时,会话的请求就会被中断,捕获到的会话。将变量word的值改为“小猫图片”。然后单击红色栏中的Run to Completion按钮,客户端想要搜索的“小狗图片”标题就发生了变化。
  6. 修改会话响应,客户端通过浏览器发送请求给服务器,服务器会返回对应的内容。Fiddler可以中断服务器的响应,并对响应进行修改,从而改变客户端显示的内容。下面讲解如何修改会话的响应。
    1. 删除服务器响应体,用户可以对会话的响应进行拦截,并删除响应体。这样,客户端收到的网页内容为空。下面是操作方法。
      1. 启动Fiddler后,当客户端正常访问网页时会返回对应的内容。例如,访问www.sohu.com。Fiddler捕获到对应的会话,查看会话内容。选中的会话包含响应体。右击该会话,复制会话的URL。在命令行中输入bpafter URL(URL为复制的会话URL)。
      2. 按回车键,设置断点命令生效。当客户端再次访问该URL时,会话的请求就会被中断。捕获到的会话。第618个会话的响应体进行了压缩,所以需要单击响应体上方的黄色栏“Response body is encoded.Click to decode”进行解压。
      3. 切换到TextView选项卡,查看响应体。删除响应体的内容(<body>标签中的内容),然后单击红色栏中的Run to Completion按钮,客户端想要打开的搜狐网页将不会显示任何内容。
    2. 更换响应体文字,通过对服务器响应体的内容进行修改,可以使客户端显示的页面发生改变。下面是具体的修改方法。
      1. 启动Fiddler,在浏览器中打开优酷首页,如图10.54所示。从图中可以看到,优酷首页的标题为“优酷-这世界很酷”,下方有一个标题为“即时热点”。
      2. 查看捕获的优酷会话。复制会话的URL,通过bpafter URL命令设置响应断点。客户端再次搜索优酷首页时就会被中断。捕获到的会话。由于图中选中的会话响应体已经过压缩,所以需要单击响应体上方的黄色栏Response body is encoded.Click to decode.进行解压。切换到TextView选项卡查看响应体。
      3. 响应体的下方是个条形栏,显示了一些其他信息,下面是这些信息的具体含义。第一栏显示光标当前所在的行和列;第二栏以偏移/总数形式显示当前字符在全部内容中的偏移;第三栏显示当前选中的字符数。
      4. 三个条形栏右边是一个搜索框,支持在内容中搜索文本。搜索的文本区分大小写,不支持正则表达式。在输入过程中Fiddler会自动执行匹配。如果找到了匹配项,搜索框会显示为绿色;否则,显示为红色。找到匹配项后,按回车键或F3键可以跳到下一个匹配项。按Ctrl+Enter键会高亮显示所有匹配项。
      5. 单击搜索框后的View in Notepad按钮,可以把文本内容保存到临时文件中,并在文本编辑器中打开。文本编辑器默认为记事本工具。单击省略号按钮,可以把内容保存到临时文件中,并弹出打开方式对话框。用户可从中选择一个程序来处理临时文件。
      6. 在搜索框中输入“优酷-这世界很酷”进行搜索。正常访问的优酷页面显示的标题为“优酷-这世界很酷”。这里将其修改为“优酷-就是酷”。用同样的方法将“即时热点”修改为“快捷热点”。
      7. 单击红色栏中的Run to Completion按钮,返回浏览器查看优酷首页。
    3. 更换响应体图片,对服务器响应体的图片进行替换也会影响客户端显示的页面。下面是替换方法。
      1. 启动Fiddler,通过浏览器浏览图片。Fiddler会捕获到浏览图片的这些会话,查看捕获图片的会话。切换到AutoResponder选项卡。选项卡可以在请求时自动触发。最上方有三个复选框,下面介绍它们的功能。Enable rules控制是否激活AutoResponder选项卡,如果没有选中该复选框,其他复选框不起作用;Unmatched requests passthrough指定当会话不匹配任何给定的规则时进行的操作;Enable Latency匹配某个规则的请求时,由该选项决定是立即执行,还是延迟Latency字段指定的毫秒时间。勾选Enable rules和Unmatched requests passthrough复选框,选中刚才的图片会话,并拖到中间的框中。单击最下面的下拉列表,选择Find a file…选项,弹出Choose response file对话框。选择要更换的图片,然后单击“打开”按钮,返回到Fiddler。单击Save按钮,开始生效。如果只要生效一次,可以勾选Match only once复选框。当客户端再次访问会话的URL时就可以看到图片已被替换。
  • 24
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值