十分鐘學會Fiddler
一.Fiddler介紹
Fiddler是一個http抓包改包工具,fiddle英文中有“欺騙、偽造”之意,與wireshark相比它更輕量級,上手簡單,因為只能抓http和https資料包,所以在針對http和https資料包的抓取上它更加專業。
不僅可以記錄客戶端和伺服器的http(s)請求,還能設定斷點,修改請求和響應的資料,模擬弱網路環境。如果這些還滿足不了你的需求,你還可以安裝外掛對Fiddler現有的功能進行擴充套件,甚至編寫指令碼實現一些自動化操作。
二.Fiddler的工作原理
當我們瀏覽網頁的時候,實際上瀏覽器會通過tcp連線以http資料包的形式向伺服器發起請求的,伺服器在接收到請求後會根據後臺程式碼邏輯做出不同的響應。
以上是系統中沒有代理,用的是直連網路的情況。這時候如果系統中設定了靜態http代理,那麼瀏覽器所有外發的http請求會被重定向到代理伺服器,代理伺服器會根據請求的目的ip將請求再轉發至相應的伺服器。同理,伺服器返回給瀏覽器的資料也要經過代理這一層。
其實Fiddler所做的和代理伺服器是一樣的事情,當我們啟用Fiddler之後,ie的http(s)代理會自動被設定為127.0.0.1:8888(之所以這麼設定是因為Fiddler是在本地8888埠進行監聽的), 所有http(s)會話的都會被Fiddler攔截。Fiddler監聽的埠號可以在下面這個地方更改:
至於Fiddler為啥可以抓https包,其實是利用了類似中間人攻擊的技術,看下面這張圖:
在瞭解Fiddler解密https的原理之前,我們首先要知道標準的https通訊原理。在https通訊中,運用到了兩種加密技術——對稱加密技術和非對稱加密技術(RSA),非對稱加密用來在握手過程中傳輸對稱祕鑰,而對稱加密技術是握手完成之後實際使用的通訊加密技術。
https實際通訊過程可以分為兩步走:
第一步,客服端和伺服器協商通訊使用的金鑰(對稱金鑰)。
這個過程可以簡單描述為——客戶端發起請求獲取伺服器的證書,證書裡包含了伺服器的RSA公鑰。客戶端生成通訊用的對稱金鑰,使用伺服器的公鑰加密後傳輸給伺服器。伺服器接收到之後使用自己的RSA私鑰解密得到傳輸用的明文祕鑰。
第二步,客服端和伺服器使用協商好的金鑰進行加密通訊。
瞭解以上常識後我們再看Fiddler解密https的過程其實不難:
-
客戶端發起請求,中間人(Fiddler)會攔截來自客戶端的請求,並將偽造的ca證書派發給客戶端。同時Fiddler向伺服器請求,獲得伺服器的ca證書。
-
客戶端接收到來自中間人(Fiddler)的證書,還傻傻的以為這個證書是來自伺服器的,並且使用證書裡的公鑰(其實是Fiddler的公鑰)對生成的通訊祕鑰(對稱金鑰)加密,傳送給伺服器。可憐的是這個資料包也會被中間人(Fiddler)攔截。
-
中間人(Fiddler)使用自己的私鑰將資料包解密,很輕鬆地得到了通訊祕鑰。之後使用伺服器的RSA公鑰對通訊金鑰加密後傳輸給伺服器。
-
伺服器接收到“客戶端”(其實是Fiddler)傳送給自己的金鑰,使用RSA私鑰解密得到明文金鑰後,建立信任。握手完成。使用對稱金鑰加密訊息, 開始通訊。
三.Fiddler的使用
網上介紹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");
- 重定向請求的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環境,你可以將這個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)
5.使用FiddlerCore做自動化
除了擁有強大外掛擴充套件能力,Fiddler還抽取了其核心能力為開發者封裝了一套sdk——FiddlerCore,可以將Fiddler的功能很好的整合到自己的應用裡。
不過遺憾的是FidderCore只支援.net開發(誰讓作者是微軟的IE專案經理呢......),可以使用Nuget為你的project整合FidderCore。
四.結語
以上就是我個人使用Fiddler的經驗總結,當然Fiddler的功能遠遠不止這些,比如:移動端抓包、模擬弱網路、http效能測試、自動化ApiTest等等,甚至可以使用Fiddler做反向代理,有興趣的同學可以繼續鑽研一下,下面是一些Fiddler學習的網站。
不知大家在工作中是否用到fiddler、wirshark這類工具,是否有使用fiddler解決問題的好案例?或者同學們如果有更好的工具推薦,都請在評論區討論一下吧!
此文已由作者授權騰訊雲技術社群釋出,轉載請註明文章出處
相關推薦
十分鐘學會Fiddler
一.Fiddler介紹 Fiddler是一個http抓包改包工具,fiddle英文中有“欺騙、偽造”之意,與wireshark相比它更輕量級,上手簡單,因為只能抓http和https資料包,所以在針對http和https資料包的抓取上它更加專業。 不僅可以記錄客戶端和
3) 十分鐘學會android--建立第一個APP,建立簡單的用戶界面
使用 圖標 run class 屏幕寬度 情況下 不可見 文本輸入框 nes 在本小節裏,我們將學習如何用 XML 創建一個帶有文本輸入框和按鈕的界面。下一節課將學會使 APP 對按鈕做出響應——按鈕被按下時,文本框裏的內容被發送到另外一個 Acti
8) 十分鐘學會android--Activity的生命周期之停止與重啟
圖標 getc uid contex ont progress 部分 重啟 settings 恰當的停止與重啟我們的activity是很重要的,在activity生命周期中,他們能確保用戶感知到程序的存在並不會丟失他們的進度。在下面一些關鍵的場景中會涉及到停止與重啟:
(轉)大資料處理之道(十分鐘學會Python)
轉自:http://blog.csdn.net/u010700335/article/details/42025391,如侵刪 (0)目錄 快速學Python 和 易犯錯誤(文字處理) Python文字處理和Java/C比對 十分鐘學會Python的基本型別 快速學會Python(
十分鐘學會Flask
什麼是Flask Flask是一個基於Python並且依賴於Jinja2模板引擎和Werkzeug WSGI服務的一個微型框架 Flask中包含一個輕量級的web 伺服器主要用於在開發階段測試使用 Falsk使用MTV框架模式 MTV框架模式 M : Models , 模型層 ,
【十分鐘學會】正則表示式字元匹配攻略
閱讀建議:看一下正則表示式基礎,有一定的基本概念,效果最佳。 正則表示式是匹配模式,要麼匹配字元,要麼匹配位置。請記住這句話。 然而關於正則如何匹配字元的學習,大部分人都覺得這塊比較雜亂。 畢竟元字元太多了,看起來沒有系統性,不好記。本
十分鐘學會Python函數語言程式設計
函數語言程式設計到底是什麼?本文將詳解其概念,同時分享怎樣在 Python 中使用函數語言程式設計。主要內容包括列表解析式和其他形式的解析式。 函式式模型 在命令式模型中,執行程式的方式是給計算機一系列指
十分鐘學會 Haskell
1 概要Haskell 是函式式(一切通過函式呼叫來完成)、靜態、隱式型別(型別由編譯器檢測,型別宣告不是必需的)、惰性(除非必要,否則什麼也不做)的語言。其最大眾化的近親大概是 ML 族語言(不過不是惰性的)。最流行(common)的 Haskell 編譯器是 GHC,下載地址。GHC 在 GNU/Linu
十分鐘學會函式式 Python!
函數語言程式設計到底是什麼?本文將詳解其概念,同時分享怎樣在 Python 中使用函數語言程式設計。主要內容包括列表解析式和其他形式的解析式。 函式式模型 在命令式模型中,執行程式的方式是給計算機一系列指令讓它執行。執行過程中計算機會改變狀態。例如,
十分鐘學會Java8新特性:lambda表示式和Stream API
Java8 的新特性:Lambda表示式、強大的 Stream API、全新時間日期 API、ConcurrentHashMap、MetaSpace。總得來說,Java8 的新特性使 Java 的執行速度更快、程式碼更少、便於並行、最大化減少空指標異常。 這篇文章分享之前我還是要推薦下我
十分鐘學會Markdown語法
Markdown 語法介紹Markdown 是一種輕量級標記語言,讓寫作者專注於寫作而不用關注樣式。Coding 的許多版塊均採用了 Markdown 語法,比如冒泡、討論、Pull Request 等。標題用 Markdown 書寫時,只需要在文字前面加上『# 』即可建立一
十分鐘學會 tmux
# 開啟滑鼠模式 set -g mode-mouse on # 允許滑鼠選擇窗格 set -g mouse-select-pane on # 如果喜歡給視窗自定義命名,那麼需要關閉視窗的自動命名 set-option -g allow-rename off # 如果對 vim
Python 十分鐘學會pandas基本資料操作
importIn[1]: import numpy as np In[2]: import pandas as pd In[3]: import matplotlib.pyplot as plt 建立物件通過list建立Series,pandas建立預設的整數索引In[4]: s = pd.Series
十分鐘學會正則表示式
1、正則表示式 正則表示式(regular expression)描述了一種字串匹配的模式,可以用來檢查一個串是否含有某種子串、將匹配的子串做替換或者從某個串中取出符合某個條件的子串等。 模式:使用一種特殊符號來實現字串的匹配 2、建立正則物件 ①隱式建立 var 正則物件
十分鐘學會Charles抓包(iOS的http/https請求)
Charles安裝HTTP抓包HTTPS抓包1. Charles安裝2. HTTP抓包(1)檢視電腦IP地址(2)設定手機HTTP代理手機連上電腦,點選“設定->無線區域網->連線的WiFi”,設定HTTP代理:伺服器為電腦IP地址:如192.168.1.169埠:8888設定代理後,需要在電腦上
十分鐘學會Python的基本型別
一:起因 (1)說起學習Python的原因,上一篇blog已經提到過了;Python掐指一算不過是自己接觸過的第四門大型語言(從接觸到現在已經2周了)c/c++ ,Java,MATLAB(PS:應該還不算入門,只會簡單的應用),之後就是python了。 (2)c/c++ 到
十分鐘學會Scratch圖形化程式設計
一、概要 Scratch是麻省理工學院開發的供兒童或者初學者學習程式設計的開發平臺。其通過點選並拖拽的方式,完成程式設計,可以使兒童或者成人程式設計初學者學習程式設計基礎概念等。Scratch是一款積木式圖形程式設計軟體。 授權協議:GPLv2 開發語言:C/C++ 官網地址:https://scratch
【轉載】十分鐘一起學會ResNet殘差網路
深層次網路訓練瓶頸:梯度消失,網路退化 深度卷積網路自然的整合了低中高不同層次的特徵,特徵的層次可以靠加深網路的層次來豐富。從而,在構建卷積網路時,網路的深度越高,可抽取的特徵層次就越豐富。所以一般我們會傾向於使用更深層次的網路結構,以便取得更高層次的特徵。但是在使用深層次的網路結構時我們會
十分鐘能學會的技巧
1,在紙上寫下 3 個你在 3 年內最想實現、願意為之努力的願望(出國讀書、買新電腦、買遊戲機、學好程式設計、改頭換面、鍛鍊身體……) 2,貼在自己每天都能看到的地方,比如顯示器下方,如果不想別人看可以貼在家裡的顯示器下 人在重複的環境中會懈怠、失去目標,這樣可以確保自己不忘初心,不讓時光被偷偷吃掉。
十分鐘能學會的簡單python爬蟲
簡單爬蟲三步走,So easy~ 本文介紹一個使用python實現爬蟲的超簡單方法,精通爬蟲挺難,但學會實現一個能滿足簡單需求的爬蟲,只需10分鐘,往下讀吧~ 該方法不能用於帶有反爬機制的頁面,但對於我這樣的非專業爬蟲使用者,幾乎遇到的各種簡單爬蟲需求都是可