十分鐘學(xué)會Fiddler

一.Fiddler介紹

Fiddler是一個http抓包改包工具,fiddle英文中有“欺騙、偽造”之意,與wireshark相比它更輕量級,上手簡單,因為只能抓http和https數(shù)據(jù)包,所以在針對http和https數(shù)據(jù)包的抓取上它更加專業(yè)。不僅可以記錄客戶端和服務(wù)器的http(s)請求,還能設(shè)置斷點,修改請求和響應(yīng)的數(shù)據(jù),模擬弱網(wǎng)絡(luò)環(huán)境。如果這些還滿足不了你的需求,你還可以安裝插件對Fiddler現(xiàn)有的功能進(jìn)行擴展,甚至編寫腳本實現(xiàn)一些自動化操作。

二.Fiddler的工作原理

當(dāng)我們?yōu)g覽網(wǎng)頁的時候,實際上瀏覽器會通過tcp連接以http數(shù)據(jù)包的形式向服務(wù)器發(fā)起請求的,服務(wù)器在接收到請求后會根據(jù)后臺代碼邏輯做出不同的響應(yīng)。以上是系統(tǒng)中沒有代理,用的是直連網(wǎng)絡(luò)的情況。這時候如果系統(tǒng)中設(shè)置了靜態(tài)http代理,那么瀏覽器所有外發(fā)的http請求會被重定向到代理服務(wù)器,代理服務(wù)器會根據(jù)請求的目的ip將請求再轉(zhuǎn)發(fā)至相應(yīng)的服務(wù)器。同理,服務(wù)器返回給瀏覽器的數(shù)據(jù)也要經(jīng)過代理這一層。其實Fiddler所做的和代理服務(wù)器是一樣的事情,當(dāng)我們啟用Fiddler之后,ie的http(s)代理會自動被設(shè)置為127.0.0.1:8888(之所以這么設(shè)置是因為Fiddler是在本地8888端口進(jìn)行監(jiān)聽的), 所有http(s)會話的都會被Fiddler攔截。Fiddler監(jiān)聽的端口號可以在下面這個地方更改:

使用http://localhost:8888/可以訪問到Fiddler的echo服務(wù)。

至于Fiddler為啥可以抓https包,其實是利用了類似中間人攻擊的技術(shù),看下面這張圖:

在了解Fiddler解密https的原理之前,我們首先要知道標(biāo)準(zhǔn)的https通信原理。在https通信中,運用到了兩種加密技術(shù)——對稱加密技術(shù)和非對稱加密技術(shù)(RSA),非對稱加密用來在握手過程中傳輸對稱秘鑰,而對稱加密技術(shù)是握手完成之后實際使用的通信加密技術(shù)。
https實際通信過程可以分為兩步走:
第一步,客服端和服務(wù)器協(xié)商通信使用的密鑰(對稱密鑰)。
這個過程可以簡單描述為——客戶端發(fā)起請求獲取服務(wù)器的證書,證書里包含了服務(wù)器的RSA公鑰??蛻舳松赏ㄐ庞玫膶ΨQ密鑰,使用服務(wù)器的公鑰加密后傳輸給服務(wù)器。服務(wù)器接收到之后使用自己的RSA私鑰解密得到傳輸用的明文秘鑰。
第二步,客服端和服務(wù)器使用協(xié)商好的密鑰進(jìn)行加密通信。
了解以上常識后我們再看Fiddler解密https的過程其實不難:
1.客戶端發(fā)起請求,中間人(Fiddler)會攔截來自客戶端的請求,并將偽造的ca證書派發(fā)給客戶端。同時Fiddler向服務(wù)器請求,獲得服務(wù)器的ca證書。
2.客戶端接收到來自中間人(Fiddler)的證書,還傻傻的以為這個證書是來自服務(wù)器的,并且使用證書里的公鑰(其實是Fiddler的公鑰)對生成的通信秘鑰(對稱密鑰)加密,發(fā)送給服務(wù)器??蓱z的是這個數(shù)據(jù)包也會被中間人(Fiddler)攔截。
3.中間人(Fiddler)使用自己的私鑰將數(shù)據(jù)包解密,很輕松地得到了通信秘鑰。之后使用服務(wù)器的RSA公鑰對通信密鑰加密后傳輸給服務(wù)器。
4.服務(wù)器接收到“客戶端”(其實是Fiddler)發(fā)送給自己的密鑰,使用RSA私鑰解密得到明文密鑰后,建立信任。握手完成。使用對稱密鑰加密消息, 開始通信。
5.后面的事情大家應(yīng)該就明白了,由于Fiddler持有通信秘鑰,客戶端和服務(wù)器的通信對其始終是透明的。這篇文章里有更加詳細(xì)的描述,文章鏈接:
http://www.mehdi-khalili.com/Fiddler-in-action/part-1/

三.Fiddler的使用

網(wǎng)上介紹Fiddler各種功能的帖子已經(jīng)不少了,這里就結(jié)合我工作中的使用來總結(jié)下Fiddler的幾個常見的使用場景。
1.模擬瀏覽器白屏的同時不影響正常抓包(可學(xué)習(xí)到:使用Fiddler設(shè)置斷點,QuickExec命令)。
因為有收到某些用戶反饋QB在某些環(huán)境下會出現(xiàn)白屏現(xiàn)象,為了針對白屏問題進(jìn)行優(yōu)化,需要對白屏現(xiàn)象穩(wěn)定復(fù)現(xiàn)。當(dāng)然瀏覽器白屏可能是多種因素造成的,瀏覽器崩潰,網(wǎng)絡(luò)卡慢導(dǎo)致網(wǎng)頁遲遲不能加載,亦有可能網(wǎng)頁本身就有問題……經(jīng)過和開發(fā)同學(xué)了解,目前重點要解決的是首頁白屏問題,QB首頁從開始導(dǎo)航到渲染成功中間有一段間隙,在這段間隙里網(wǎng)頁在視覺上會保持“白屏”的狀態(tài),如果這個時間比較長就會給用戶不好的體驗。可以給這種“白屏”做一個具體的定義:首頁打開20s后如果仍未成功渲染就定義為發(fā)生了一次“白屏”現(xiàn)象。測試的時候我們要模擬這種白屏現(xiàn)象,只要找到一種方法可以讓標(biāo)簽頁打開20s之內(nèi)始終保持“白屏”狀態(tài)即可。
當(dāng)然對網(wǎng)絡(luò)進(jìn)行限速可以達(dá)到這個目的,但是我測試中有在模擬白屏的同不影響正常抓包的需求,而一般的限速工具(比如電腦管家)只是應(yīng)用級的限速,無法做到針對特定請求限速。所以首先想到的是使用Fiddler的設(shè)置http斷點功能,將QB啟動時發(fā)起的導(dǎo)航頁請求卡住,讓其遲遲不能獲取導(dǎo)航頁服務(wù)器的響應(yīng),保持這個狀態(tài)20s即可成功觸發(fā)“白屏”現(xiàn)象。
點擊Fiddler左下角的這個位置,默認(rèn)這個位置是空白的,當(dāng)點擊后圖標(biāo)變?yōu)橄蛏系募^時Fiddler會攔截所有http(s)請求,如果是向下的箭頭會攔截所有的響應(yīng)。請求被攔截時QB會一直保持白屏狀態(tài),維持20s觸發(fā)“白屏”。全局?jǐn)帱c會攔截所有的http(s)請求,如果只想模擬導(dǎo)航頁的白屏,可以設(shè)置下filters,但是如果想模擬導(dǎo)航頁白屏的同時不影響其他網(wǎng)頁的正常抓包,我們還得求助于bpu命令。

bpu是一個QuickExec命令, QuickExec命令輸入框在fiddler的左下方可以找到(那個黑色的長條)。bpu命令格式:bpu {url},這里直接在QuickExec下輸入
bpu https://daohang.qq.com/?fr=hmpage,就會成功設(shè)置斷點,只要一發(fā)現(xiàn)url為“https://daohang.qq.com/?fr=hmpage”的請求,F(xiàn)iddler就會將其中斷。而其他的http請求仍然可以正常發(fā)送。這種方法可以在制造白屏的同時正常抓包。如果想取消之前設(shè)置的斷點在QuickExec下直接輸入bpu(無參數(shù))即可。

由此延伸著學(xué)習(xí)了下Fiddler提供的一些常見的QuickExec的命令,列舉幾個相對來說比較實用的:

Tips:
(1)和bash shell類似,使用方向鍵上、下,可以切換QuickExec歷史命令;
(2)值得一提的是內(nèi)置的QuickExec命令其實是通過FiddlerScript(FiddlerScript會在下一部分介紹)定義的,如果這些命令仍舊不能滿足你的需求,你可以在對應(yīng)的地方添加自定義命令。

2.修改網(wǎng)絡(luò)請求
在工作中時不時會因某些原因需要修改網(wǎng)絡(luò)請求,主要有以下場景(但不限于此):
(1)當(dāng)前請求的的內(nèi)容與將要上線的功能存在局部差異,一般是一些請求參數(shù)的差異;
(2)某些后臺服務(wù)ip或端口發(fā)生變更。
當(dāng)然你可以使用Fiddler的composer對想要修改請求包進(jìn)行重構(gòu)——打開composer標(biāo)簽,將要修改的session拖到composer里即可修改。但是如果想對某些特定的url自動的改包,還得使用FiddlerScript來做。使用FiddlerScript的簡要步驟如下:
(1)安裝Fiddler script editor插件,安裝后可以在右側(cè)發(fā)現(xiàn)多了一個選項卡FiddlerScript:

(2)Fiddlerscript的語法和js有點類似,簡單學(xué)習(xí)下,發(fā)現(xiàn)如果要改請求參數(shù)可以在OnBeforeRequest這個function里對Session對象的url屬性進(jìn)行修改。下面是一段示例代碼,可以做到自動對GET請求中的個別參數(shù)修改:

(3)點擊左上角的【save script】保存修改
(4)重新觸發(fā)請求,使用Fiddler抓包,可以看到host參數(shù)自動被替換為了我們指定的值。
官方文檔上列舉了比較幾類常見的改包場景:
(1)添加或刪除一個請求頭;
oSession.oRequest["NewHeaderName"] = "New header value";

oSession.oResponse.headers.Remove("Set-Cookie");
(2)重定向請求的file、hostname、port;
if (oSession.PathAndQuery=="/version1.css")
oSession.PathAndQuery="/version2.css";

if (oSession.HostnameIs("www.bayden.com"))
oSession.hostname="test.bayden.com";

if (oSession.host=="www.bayden.com:8080")
oSession.host="test.bayden.com:9090";
3.線上文件映射到本地調(diào)試(可學(xué)習(xí)到:auto response)
使用Fiddler可以將線上的文件映射到本地調(diào)試,比如線上某個js文件有一個bug,這時你身邊的電腦上又沒有裝ide環(huán)境,你可以將這個js文件下載下來在本地修改,然后使用Fiddler的auto response功能將所有請求線上js的會話重定向到本地js文件,這樣就可以直接在線上實時觀察修改結(jié)果了。例如下圖里,我使用本地的jquery文件對線上jquery文件“替換”。

注意:線上引用的jquery之前是1.11.3的,加了auto response規(guī)則后再次請求后,F(xiàn)iddler使用本地3.1.1的jquery替換了原始的response。
4.Fiddler抓localhost(127.0.0.1)
有時候需要對本地的服務(wù)抓包分析,使用Fiddler也是可以抓到的。在localhost或127.0.0.1后面加點“.”就可以了,例如:http://localhost.:8080。另外使用本機ip或機器名訪問Fiddler也是可以抓到的。

5.使用FiddlerCore做自動化
除了擁有強大插件擴展能力,F(xiàn)iddler還抽取了其核心能力為開發(fā)者封裝了一套sdk——FiddlerCore,可以將Fiddler的功能很好的集成到自己的應(yīng)用里。

不過遺憾的是FidderCore只支持.net開發(fā)(誰讓作者是微軟的IE項目經(jīng)理呢......),可以使用Nuget為你的project集成FidderCore。

篇幅有限,有興趣的話可以去官網(wǎng)
http://www.telerik.com/fiddler/fiddlercore下文檔學(xué)習(xí)。

四.結(jié)語

以上就是我個人使用Fiddler的經(jīng)驗總結(jié),當(dāng)然Fiddler的功能遠(yuǎn)遠(yuǎn)不止這些,比如:移動端抓包、模擬弱網(wǎng)絡(luò)、http性能測試、自動化ApiTest等等,甚至可以使用Fiddler做反向代理,有興趣的同學(xué)可以繼續(xù)鉆研一下,下面是一些Fiddler學(xué)習(xí)的網(wǎng)站。
Fiddler官網(wǎng):
http://www.telerik.com/Fiddler
Fiddler的google論壇(Fiddler作者Eric Lawrence偶爾也會在上面回答一些問題):
https://groups.google.com/forum/#!forum/httpFiddler。

作者:李文哲 騰訊移動品質(zhì)中心TMQ

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容