一.Fiddler介紹
Fiddler是一個http抓包改包工具,fiddle英文中有“欺騙、偽造”之意,與wireshark相比它更輕量級,上手簡單,因為只能抓http和https數(shù)據(jù)包,所以在針對http和https數(shù)據(jù)包的抓取上它更加專業(yè)。不僅可以記錄客戶端和服務器的http(s)請求,還能設置斷點,修改請求和響應的數(shù)據(jù),模擬弱網(wǎng)絡環(huán)境。如果這些還滿足不了你的需求,你還可以安裝插件對Fiddler現(xiàn)有的功能進行擴展,甚至編寫腳本實現(xiàn)一些自動化操作。
二.Fiddler的工作原理
當我們?yōu)g覽網(wǎng)頁的時候,實際上瀏覽器會通過tcp連接以http數(shù)據(jù)包的形式向服務器發(fā)起請求的,服務器在接收到請求后會根據(jù)后臺代碼邏輯做出不同的響應。以上是系統(tǒng)中沒有代理,用的是直連網(wǎng)絡的情況。這時候如果系統(tǒng)中設置了靜態(tài)http代理,那么瀏覽器所有外發(fā)的http請求會被重定向到代理服務器,代理服務器會根據(jù)請求的目的ip將請求再轉發(fā)至相應的服務器。同理,服務器返回給瀏覽器的數(shù)據(jù)也要經(jīng)過代理這一層。其實Fiddler所做的和代理服務器是一樣的事情,當我們啟用Fiddler之后,ie的http(s)代理會自動被設置為127.0.0.1:8888(之所以這么設置是因為Fiddler是在本地8888端口進行監(jiān)聽的), 所有http(s)會話的都會被Fiddler攔截。Fiddler監(jiān)聽的端口號可以在下面這個地方更改:
使用http://localhost:8888/可以訪問到Fiddler的echo服務。
至于Fiddler為啥可以抓https包,其實是利用了類似中間人攻擊的技術,看下面這張圖:
在了解Fiddler解密https的原理之前,我們首先要知道標準的https通信原理。在https通信中,運用到了兩種加密技術——對稱加密技術和非對稱加密技術(RSA),非對稱加密用來在握手過程中傳輸對稱秘鑰,而對稱加密技術是握手完成之后實際使用的通信加密技術。
https實際通信過程可以分為兩步走:
第一步,客服端和服務器協(xié)商通信使用的密鑰(對稱密鑰)。
這個過程可以簡單描述為——客戶端發(fā)起請求獲取服務器的證書,證書里包含了服務器的RSA公鑰。客戶端生成通信用的對稱密鑰,使用服務器的公鑰加密后傳輸給服務器。服務器接收到之后使用自己的RSA私鑰解密得到傳輸用的明文秘鑰。
第二步,客服端和服務器使用協(xié)商好的密鑰進行加密通信。
了解以上常識后我們再看Fiddler解密https的過程其實不難:
1.客戶端發(fā)起請求,中間人(Fiddler)會攔截來自客戶端的請求,并將偽造的ca證書派發(fā)給客戶端。同時Fiddler向服務器請求,獲得服務器的ca證書。
2.客戶端接收到來自中間人(Fiddler)的證書,還傻傻的以為這個證書是來自服務器的,并且使用證書里的公鑰(其實是Fiddler的公鑰)對生成的通信秘鑰(對稱密鑰)加密,發(fā)送給服務器。可憐的是這個數(shù)據(jù)包也會被中間人(Fiddler)攔截。
3.中間人(Fiddler)使用自己的私鑰將數(shù)據(jù)包解密,很輕松地得到了通信秘鑰。之后使用服務器的RSA公鑰對通信密鑰加密后傳輸給服務器。
4.服務器接收到“客戶端”(其實是Fiddler)發(fā)送給自己的密鑰,使用RSA私鑰解密得到明文密鑰后,建立信任。握手完成。使用對稱密鑰加密消息, 開始通信。
5.后面的事情大家應該就明白了,由于Fiddler持有通信秘鑰,客戶端和服務器的通信對其始終是透明的。這篇文章里有更加詳細的描述,文章鏈接:
http://www.mehdi-khalili.com/Fiddler-in-action/part-1/。
三.Fiddler的使用
網(wǎng)上介紹Fiddler各種功能的帖子已經(jīng)不少了,這里就結合我工作中的使用來總結下Fiddler的幾個常見的使用場景。
1.模擬瀏覽器白屏的同時不影響正常抓包(可學習到:使用Fiddler設置斷點,QuickExec命令)。
因為有收到某些用戶反饋QB在某些環(huán)境下會出現(xiàn)白屏現(xiàn)象,為了針對白屏問題進行優(yōu)化,需要對白屏現(xiàn)象穩(wěn)定復現(xiàn)。當然瀏覽器白屏可能是多種因素造成的,瀏覽器崩潰,網(wǎng)絡卡慢導致網(wǎng)頁遲遲不能加載,亦有可能網(wǎng)頁本身就有問題……經(jīng)過和開發(fā)同學了解,目前重點要解決的是首頁白屏問題,QB首頁從開始導航到渲染成功中間有一段間隙,在這段間隙里網(wǎng)頁在視覺上會保持“白屏”的狀態(tài),如果這個時間比較長就會給用戶不好的體驗。可以給這種“白屏”做一個具體的定義:首頁打開20s后如果仍未成功渲染就定義為發(fā)生了一次“白屏”現(xiàn)象。測試的時候我們要模擬這種白屏現(xiàn)象,只要找到一種方法可以讓標簽頁打開20s之內始終保持“白屏”狀態(tài)即可。
當然對網(wǎng)絡進行限速可以達到這個目的,但是我測試中有在模擬白屏的同不影響正常抓包的需求,而一般的限速工具(比如電腦管家)只是應用級的限速,無法做到針對特定請求限速。所以首先想到的是使用Fiddler的設置http斷點功能,將QB啟動時發(fā)起的導航頁請求卡住,讓其遲遲不能獲取導航頁服務器的響應,保持這個狀態(tài)20s即可成功觸發(fā)“白屏”現(xiàn)象。
點擊Fiddler左下角的這個位置,默認這個位置是空白的,當點擊后圖標變?yōu)橄蛏系募^時Fiddler會攔截所有http(s)請求,如果是向下的箭頭會攔截所有的響應。請求被攔截時QB會一直保持白屏狀態(tài),維持20s觸發(fā)“白屏”。全局斷點會攔截所有的http(s)請求,如果只想模擬導航頁的白屏,可以設置下filters,但是如果想模擬導航頁白屏的同時不影響其他網(wǎng)頁的正常抓包,我們還得求助于bpu命令。
bpu是一個QuickExec命令, QuickExec命令輸入框在fiddler的左下方可以找到(那個黑色的長條)。bpu命令格式:bpu {url},這里直接在QuickExec下輸入
bpu https://daohang.qq.com/?fr=hmpage,就會成功設置斷點,只要一發(fā)現(xiàn)url為“https://daohang.qq.com/?fr=hmpage”的請求,F(xiàn)iddler就會將其中斷。而其他的http請求仍然可以正常發(fā)送。這種方法可以在制造白屏的同時正常抓包。如果想取消之前設置的斷點在QuickExec下直接輸入bpu(無參數(shù))即可。
由此延伸著學習了下Fiddler提供的一些常見的QuickExec的命令,列舉幾個相對來說比較實用的:
Tips:
(1)和bash shell類似,使用方向鍵上、下,可以切換QuickExec歷史命令;
(2)值得一提的是內置的QuickExec命令其實是通過FiddlerScript(FiddlerScript會在下一部分介紹)定義的,如果這些命令仍舊不能滿足你的需求,你可以在對應的地方添加自定義命令。
2.修改網(wǎng)絡請求
在工作中時不時會因某些原因需要修改網(wǎng)絡請求,主要有以下場景(但不限于此):
(1)當前請求的的內容與將要上線的功能存在局部差異,一般是一些請求參數(shù)的差異;
(2)某些后臺服務ip或端口發(fā)生變更。
當然你可以使用Fiddler的composer對想要修改請求包進行重構——打開composer標簽,將要修改的session拖到composer里即可修改。但是如果想對某些特定的url自動的改包,還得使用FiddlerScript來做。使用FiddlerScript的簡要步驟如下:
(1)安裝Fiddler script editor插件,安裝后可以在右側發(fā)現(xiàn)多了一個選項卡FiddlerScript:
(2)Fiddlerscript的語法和js有點類似,簡單學習下,發(fā)現(xiàn)如果要改請求參數(shù)可以在OnBeforeRequest這個function里對Session對象的url屬性進行修改。下面是一段示例代碼,可以做到自動對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.線上文件映射到本地調試(可學習到:auto response)
使用Fiddler可以將線上的文件映射到本地調試,比如線上某個js文件有一個bug,這時你身邊的電腦上又沒有裝ide環(huán)境,你可以將這個js文件下載下來在本地修改,然后使用Fiddler的auto response功能將所有請求線上js的會話重定向到本地js文件,這樣就可以直接在線上實時觀察修改結果了。例如下圖里,我使用本地的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)
有時候需要對本地的服務抓包分析,使用Fiddler也是可以抓到的。在localhost或127.0.0.1后面加點“.”就可以了,例如:http://localhost.:8080。另外使用本機ip或機器名訪問Fiddler也是可以抓到的。
5.使用FiddlerCore做自動化
除了擁有強大插件擴展能力,F(xiàn)iddler還抽取了其核心能力為開發(fā)者封裝了一套sdk——FiddlerCore,可以將Fiddler的功能很好的集成到自己的應用里。
不過遺憾的是FidderCore只支持.net開發(fā)(誰讓作者是微軟的IE項目經(jīng)理呢......),可以使用Nuget為你的project集成FidderCore。
篇幅有限,有興趣的話可以去官網(wǎng)
http://www.telerik.com/fiddler/fiddlercore下文檔學習。
四.結語
以上就是我個人使用Fiddler的經(jīng)驗總結,當然Fiddler的功能遠遠不止這些,比如:移動端抓包、模擬弱網(wǎng)絡、http性能測試、自動化ApiTest等等,甚至可以使用Fiddler做反向代理,有興趣的同學可以繼續(xù)鉆研一下,下面是一些Fiddler學習的網(wǎng)站。
Fiddler官網(wǎng):
http://www.telerik.com/Fiddler
Fiddler的google論壇(Fiddler作者Eric Lawrence偶爾也會在上面回答一些問題):
https://groups.google.com/forum/#!forum/httpFiddler。
作者:李文哲 騰訊移動品質中心TMQ