Fiddler是一個http抓包改包工具,fiddle英文中有「欺騙、僞造」之意,與wireshark相比它更輕量級,上手簡單,由於只能抓http和https數據包,因此在針對http和https數據包的抓取上它更加專業。css
不只能夠記錄客戶端和服務器的http(s)請求,還能設置斷點,修改請求和響應的數據,模擬弱網絡環境。若是這些還知足不了你的需求,你還能夠安裝插件對Fiddler現有的功能進行擴展,甚至編寫腳本實現一些自動化操做。jquery
當咱們瀏覽網頁的時候,實際上瀏覽器會經過tcp鏈接以http數據包的形式向服務器發起請求的,服務器在接收到請求後會根據後臺代碼邏輯作出不一樣的響應。shell
以上是系統中沒有代理,用的是直連網絡的狀況。這時候若是系統中設置了靜態http代理,那麼瀏覽器全部外發的http請求會被重定向到代理服務器,代理服務器會根據請求的目的ip將請求再轉發至相應的服務器。同理,服務器返回給瀏覽器的數據也要通過代理這一層。瀏覽器
其實Fiddler所作的和代理服務器是同樣的事情,當咱們啓用Fiddler以後,ie的http(s)代理會自動被設置爲127.0.0.1:8888(之因此這麼設置是由於Fiddler是在本地8888端口進行監聽的), 全部http(s)會話的都會被Fiddler攔截。Fiddler監聽的端口號能夠在下面這個地方更改:bash
使用http://localhost:8888/能夠訪問到Fiddler的echo服務服務器
至於Fiddler爲啥能夠抓https包,實際上是利用了相似中間人攻擊的技術,看下面這張圖:網絡
在瞭解Fiddler解密https的原理以前,咱們首先要知道標準的https通訊原理。在https通訊中,運用到了兩種加密技術——對稱加密技術和非對稱加密技術(RSA),非對稱加密用來在握手過程當中傳輸對稱祕鑰,而對稱加密技術是握手完成以後實際使用的通訊加密技術。session
https實際通訊過程能夠分爲兩步走:composer
第一步,客服端和服務器協商通訊使用的密鑰(對稱密鑰)。tcp
這個過程能夠簡單描述爲——客戶端發起請求獲取服務器的證書,證書裏包含了服務器的RSA公鑰。客戶端生成通訊用的對稱密鑰,使用服務器的公鑰加密後傳輸給服務器。服務器接收到以後使用本身的RSA私鑰解密獲得傳輸用的明文祕鑰。
第二步,客服端和服務器使用協商好的密鑰進行加密通訊。
瞭解以上常識後咱們再看Fiddler解密https的過程其實不難:
客戶端發起請求,中間人(Fiddler)會攔截來自客戶端的請求,並將僞造的ca證書派發給客戶端。同時Fiddler向服務器請求,得到服務器的ca證書。
客戶端接收到來自中間人(Fiddler)的證書,還傻傻的覺得這個證書是來自服務器的,而且使用證書裏的公鑰(實際上是Fiddler的公鑰)對生成的通訊祕鑰(對稱密鑰)加密,發送給服務器。可憐的是這個數據包也會被中間人(Fiddler)攔截。
中間人(Fiddler)使用本身的私鑰將數據包解密,很輕鬆地獲得了通訊祕鑰。以後使用服務器的RSA公鑰對通訊密鑰加密後傳輸給服務器。
服務器接收到「客戶端」(實際上是Fiddler)發送給本身的密鑰,使用RSA私鑰解密獲得明文密鑰後,創建信任。握手完成。使用對稱密鑰加密消息, 開始通訊。
後面的事情你們應該就明白了,因爲Fiddler持有通訊祕鑰,客戶端和服務器的通訊對其始終是透明的。這篇文章裏有更加詳細的描述,文章連接:http://www.mehdi-khalili.com/Fiddler-in-action/part-1/
網上介紹Fiddler各類功能的帖子已經很多了,這裏就結合我工做中的使用來總結下Fiddler的幾個常見的使用場景。
1.模擬瀏覽器白屏的同時不影響正常抓包(可學習到:使用Fiddler設置斷點,QuickExec命令)。
由於有收到某些用戶反饋QB在某些環境下會出現白屏現象,爲了針對白屏問題進行優化,須要對白屏現象穩定復現。固然瀏覽器白屏多是多種因素形成的,瀏覽器崩潰,網絡卡慢致使網頁遲遲不能加載,亦有可能網頁自己就有問題……
通過和開發同窗瞭解,目前重點要解決的是首頁白屏問題,QB首頁從開始導航到渲染成功中間有一段間隙,在這段間隙裏網頁在視覺上會保持「白屏」的狀態,若是這個時間比較長就會給用戶很差的體驗。能夠給這種「白屏」作一個具體的定義:首頁打開20s後若是仍未成功渲染就定義爲發生了一次「白屏」現象。測試的時候咱們要模擬這種白屏現象,只要找到一種方法可讓標籤頁打開20s以內始終保持「白屏」狀態便可。
固然對網絡進行限速能夠達到這個目的,可是我測試中有在模擬白屏的同不影響正常抓包的需求,而通常的限速工具(好比電腦管家)只是應用級的限速,沒法作到針對特定請求限速。
因此首先想到的是使用Fiddler的設置http斷點功能,將QB啓動時發起的導航頁請求卡住,讓其遲遲不能獲取導航頁服務器的響應,保持這個狀態20s便可成功觸發「白屏」現象。點擊Fiddler左下角的這個位置,默認這個位置是空白的,當點擊後圖標變爲向上的箭頭時Fiddler會攔截全部http(s)請求,若是是向下的箭頭會攔截全部的響應。請求被攔截時QB會一直保持白屏狀態,維持20s觸發「白屏」。全局斷點會攔截全部的http(s)請求,若是隻想模擬導航頁的白屏,能夠設置下filters,可是若是想模擬導航頁白屏的同時不影響其餘網頁的正常抓包,咱們還得求助於bpu命令。
bpu是一個QuickExec命令, QuickExec命令輸入框在fiddler的左下方能夠找到(那個黑色的長條)。bpu命令格式:bpu {url}
,這裏直接在QuickExec下輸入bpu https://daohang.qq.com/?fr=hmpage
,就會成功設置斷點,只要一發現url爲https://daohang.qq.com/?fr=hmpage
的請求,Fiddler就會將其中斷。而其餘的http請求仍然能夠正常發送。這種方法能夠在製造白屏的同時正常抓包。若是想取消以前設置的斷點在QuickExec下直接輸入bpu(無參數)便可。
由此延伸着學習了下Fiddler提供的一些常見的QuickExec的命令,列舉幾個相對來講比較實用的:
Tips:
(1)和bash shell相似,使用方向鍵上、下,能夠切換QuickExec歷史命令;
(2)值得一提的是內置的QuickExec命令實際上是經過FiddlerScript(FiddlerScript會在下一部分介紹)定義的,若是這些命令仍舊不能知足你的需求,你能夠在對應的地方添加自定義命令。
2.修改網絡請求
在工做中時不時會因某些緣由須要修改網絡請求,主要有如下場景(但不限於此):
當前請求的的內容與將要上線的功能存在局部差別,通常是一些請求參數的差別;
某些後臺服務ip或端口發生變動。
固然你可使用Fiddler的composer對想要修改請求包進行重構——打開composer標籤,將要修改的session拖到composer裏便可修改。可是若是想對某些特定的url自動的改包,還得使用FiddlerScript來作。使用FiddlerScript的簡要步驟以下:
(1)安裝Fiddler script editor插件,安裝後能夠在右側發現多了一個選項卡FiddlerScript:
(2)Fiddlerscript的語法和js有點相似,簡單學習下,發現若是要改請求參數能夠在OnBeforeRequest這個function裏對Session對象的url屬性進行修改。下面是一段示例代碼,能夠作到自動對GET請求中的個別參數修改:
(3)點擊左上角的【save script】保存修改.
(4)從新觸發請求,使用Fiddler抓包,能夠看到host參數自動被替換爲了咱們指定的值。
官方文檔上列舉了比較幾類常見的改包場景:
oSession.oRequest["NewHeaderName"] = "New header value"; oSession.oResponse.headers.Remove("Set-Cookie");
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環境,你能夠將這個js文件下載下來在本地修改,而後使用Fiddler的auto response功能將全部請求線上js的會話重定向到本地js文件,這樣就能夠直接在線上實時觀察修改結果了。例以下圖裏,我使用本地的jquery文件對線上jquery文件「替換」。
注意:線上引用的jquery以前是1.11.3的,加了auto response規則後再次請求後,Fiddler使用本地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作自動化
除了擁有強大插件擴展能力,Fiddler還抽取了其核心能力爲開發者封裝了一套sdk——FiddlerCore,能夠將Fiddler的功能很好的集成到本身的應用裏。
不過遺憾的是FidderCore只支持.net開發(誰讓做者是微軟的IE項目經理呢......),可使用Nuget爲你的project集成FidderCore。
篇幅有限,有興趣的話能夠去官網http://www.telerik.com/fiddler/fiddlercore下文檔學習。
以上就是我我的使用Fiddler的經驗總結,固然Fiddler的功能遠遠不止這些,好比:移動端抓包、模擬弱網絡、http性能測試、自動化ApiTest等等,甚至可使用Fiddler作反向代理,有興趣的同窗能夠繼續鑽研一下,下面是一些Fiddler學習的網站。
Fiddler官網:
http://www.telerik.com/Fiddler
Fiddler的google論壇(Fiddler做者Eric Lawrence偶爾也會在上面回答一些問題):
https://groups.google.com/forum/#!forum/httpFiddler。
不知你們在工做中是否用到fiddler、wirshark這類工具,是否有使用fiddler解決問題的好案例?或者同窗們若是有更好的工具推薦,都請在評論區討論一下吧!
此文已由做者受權騰訊雲技術社區發佈,轉載請註明文章出處