1. 程式人生 > >前端利器躬行記(6)——Fiddler

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

  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  美化後的指令碼

&n