測試工程師良品 —— Fiddler工具簡介
一、前言
Fiddler 是目前最強大最好用的調(diào)試工具之一,它能記錄所有客戶端和服務(wù)器的http和https請求,設(shè)置 CGI 請求的斷點,甚至修改輸入輸出數(shù)據(jù)。
fiddler 的工作原理,是它在 web server 和 web browser 之間搭了一層 proxy,所有的請求都會經(jīng)過它,如下圖所示:
fiddler可以針對web端和移動端網(wǎng)絡(luò)請求進行抓包分析,如何安裝和實現(xiàn)抓包,以及如何在無數(shù)請求中運用強大的過濾機制進行精準(zhǔn)定位,這里不再進行介紹。fiddler除了進行以上常用功能之外,還能針對抓包過程和請求進行設(shè)置。以下將按照fiddler菜單和fiddler script分類介紹fiddler的一些功能。
二、Fiddler 菜單頁面
除了對web端和移動端進行抓包之外,fiddler菜單還可以實現(xiàn)以下常用功能。
- 設(shè)置斷點
- Fiddler AutoResponder 請求地址重定向
- fiddler限速
1. 設(shè)置斷點
斷點可以分為request和response斷點。request斷點是打在request請求的時候,未到達服務(wù)器之前,response斷點是打在服務(wù)器響應(yīng)之后,在Fiddler將響應(yīng)傳回給客戶端之前攔截??梢酝ㄟ^打斷點,修改請求內(nèi)容,達到需要的目的。
Fiddler可以修改以下請求:
- Fiddler設(shè)置斷點,可以修改HTTP請求頭信息,如修改Cookie,User-Agent等
- 可以修改請求數(shù)據(jù),突破表單限制,提交任意數(shù)字,如充值最大100,可以修改成10000
- 攔截響應(yīng)數(shù)據(jù),修改響應(yīng)體,如修改服務(wù)端返回的頁面數(shù)據(jù)
全局?jǐn)帱c:這種方法會中斷所有的會話
- 設(shè)置斷點:Rules-> Automatic Breakpoint ->[type]
- 清除斷點:Rules-> Automatic Breakpoint ->Disabled
單個斷點
(1) 請求前斷點(before response): bpu
- 在命令行中輸入: bpu www.baidu.com
- 清除斷點:在命令行中輸入bpu
(2) 響應(yīng)后斷點(after requests): bpafter
- 在命令行輸入:bpafter www.baidu.com
- 清除斷點: 在命令行中輸入bpafter
斷點設(shè)置并成功攔截請求,可以在右側(cè)分析區(qū)修改數(shù)據(jù),并選擇 run to continue 或者繼續(xù) break on response。
2. Fiddler AutoResponder 請求地址重定向
AutoResponder 是 Fiddler 比較重要且比較強大的功能之一??捎糜跀r截某一請求,并重定向到本地的資源,或者使用Fiddler的內(nèi)置響應(yīng)??捎糜谡{(diào)試服務(wù)器端代碼而無需修改服務(wù)器端的代碼和配置,因為攔截和重定向后,實際上訪問的是本地的文件或者得到的是Fiddler的內(nèi)置響應(yīng)。
如圖所示,勾選按鈕,并點擊 Add Rule ,將 Rule Editor 第一行修改為線上檔案位址,按下 Rule Editor 第二行右邊的箭頭,選擇 Find a file ... ,選擇要替換成的本機端檔案,按下右邊的 SAVE ,大功告成;將線上檔案替換成另一個線上檔案,只需在 Rule Editor 第二行填入的是另一線上檔案位址。
如圖:
3. Fiddler 限速
web 前端研發(fā)過程中,我們都希望在網(wǎng)速很慢的時候,用戶首先看到的是渲染出的界面,而不是一片空白。那么這個時候,網(wǎng)絡(luò)限速就能很方便在 localhost 針對類似的情況來做性能調(diào)試與優(yōu)化。
通過 fiddler 來模擬限速,是因為 fiddler 本來就是個代理,它提供了客戶端請求前和服務(wù)器響應(yīng)前的回調(diào)接口,我們可以在這些接口里面自定義一些邏輯。Fiddler 的模擬限速正是在客戶端請求前來自定義限速的邏輯,此邏輯是通過延遲發(fā)送數(shù)據(jù)或接收的數(shù)據(jù)的時間來限制網(wǎng)絡(luò)的下載速度和上傳速度,從而達到限速的效果。
開啟方法如下:Rules → Performances → Simulate Modem Speeds。勾選之后,會發(fā)現(xiàn)網(wǎng)速瞬間慢下來了很多。
菜單欄可以直接開啟限速,但是網(wǎng)絡(luò)限速數(shù)值是多少,需要通過 fiddler script 進行查看和設(shè)置。
三、Fiddler script
在 web 前端開發(fā)的過程中,大多數(shù)情況下,通過 fiddler 默認(rèn)菜單的功能可以滿足開發(fā)者的很多調(diào)試需求,然而當(dāng)有更復(fù)雜的調(diào)試場景時,需要通過 Fiddler Script 實現(xiàn)。
Fiddler Script 的本質(zhì)其實是用 JScript.NET 語言寫的一個腳本文件 CustomRules.js,語法類似于 C#, 通過修改 CustomRules.js 可以實現(xiàn)很多菜單欄不能直接實現(xiàn)的功能。
Fiddler script 可以實現(xiàn)的功能:
- 設(shè)置限速數(shù)據(jù)
- 修改http的Request或Response
打開腳本文件CustomRules.js有兩種方法:
- CustomRules.js 位于 C:\Documents and Settings\[your user]\My Documents\Fiddler2\Scripts\CustomRules.js,打開文件即可
- 在 Fiddler 中打開 CustomRules.js 文件:啟動Fiddler, 點擊菜單 Rules->Customize Rules,彈出 Fiddler Script 編輯框,即可編輯文件
1. 設(shè)置限速數(shù)據(jù)
打開fiddler script編輯框,找到如下代碼:
- if (m_SimulateModem) {
- // Delay sends by 500ms per KB uploaded.
- oSession["request-trickle-delay"] = "500";
- // Delay receives by 150ms per KB downloaded.
- oSession["response-trickle-delay"] = "150";
- }
“500”和“150”就是當(dāng)前delay的時間,可以按照需要手動修改。
算法就是 1000/下載速度 = 需要delay的時間(毫秒),比如50kB/s 需要delay20毫秒來接收數(shù)據(jù),所以根據(jù)你需要的網(wǎng)絡(luò)速度來修改上述值。
【注】:存檔之后,原本已經(jīng)勾選的Simulate Modem Speeds 會被取消勾選,需要再到Rules → Performances → Simulate Modem Speeds 勾選,同時需要注意一定要禁用瀏覽器代理插件,以及修改完成后重啟瀏覽器才能生效。
2. 修改http的Request或Response
修改 Request 和 Response 要在 FiddlerScript 中的 OnBeforeRequest 和 OnBeforeResponse 函數(shù)中添加規(guī)則即可。OnBeforeRequest 函數(shù)是在每次請求之前調(diào)用,OnBeforeResponse 函數(shù)是在每次響應(yīng)之前調(diào)用。
將請求轉(zhuǎn)發(fā)到相同端口號的不同服務(wù)器(修改請求的 Host)
- if(oSession.HostnameIs("www.baidu.com")) {
- oSession.hostname = "www.sina.com.cn";
- }
這個例子是將發(fā)送到百度的請求轉(zhuǎn)發(fā)到新浪,這里只是改變了host,并不改變后面的地址。如下面圖片所示:
除此之外,通過修改 fiddler script 文件內(nèi)容,可以實現(xiàn)很多通過菜單欄無法實現(xiàn)的功能,包括修改 session 的樣式,修改 http(s) 請求內(nèi)容,還可以定制 rule 菜單的子菜單等,可以自行學(xué)習(xí)。
Fiddler 作為目前最好用的調(diào)試工具之一,功能很強大,這里僅做簡單介紹,有興趣的可以深入學(xué)習(xí)。
四、與其他抓包軟件的區(qū)別
1. 與charles:
fiddler 有win和linux版本,linux版本需要在Mono環(huán)境中運行;charles 沒有平臺限制。Fiddler屬于上游,在fiddler里面對http進行的一些修改直接會影響到Charles里面的請求結(jié)果。
2. 與WinPcap:
Winpcap是一個Win32平臺下用于抓包和分析的系統(tǒng),包括一個內(nèi)核級別的packet filter,一個底層的DLL(packet.dll)和一個高級的獨立于系統(tǒng)的DLL(Wpcap.dll)。主要抓取底層通信數(shù)據(jù)包,比如協(xié)議棧、數(shù)據(jù)流組裝等,是底層環(huán)境可以直接操縱網(wǎng)絡(luò)通信的程序。
它不依靠主機的諸如TCP/IP協(xié)議去收發(fā)數(shù)據(jù)包,這意味著它不能處理同一臺主機中各程序之間的通信數(shù)據(jù)。跟fiddler抓取的http(s)數(shù)據(jù)包有本質(zhì)區(qū)別。
【本文是51CTO專欄機構(gòu)“豈安科技”的原創(chuàng)文章,轉(zhuǎn)載請通過微信公眾號(bigsec)聯(lián)系原作者】