Fiddler基礎知識
- Fiddler是強大的抓包工具,它的原理是以web代理服務器的形式進行工作的,使用的代理地址是:127.0.0.1,端口默認為8888,我們也可以通過設置進行修改。
- 代理就是在客戶端和服務器之間設置一道關卡,客戶端先將請求數據發送出去后,代理服務器會將數據包進行攔截,代理服務器再冒充客戶端發送數據到服務器;同理,服務器將響應數據返回,代理服務器也會將數據攔截,再返回給客戶端。
- Fiddler可以抓取支持http代理的任意程序的數據包,如果要抓取https會話,要先安裝證書。
HTTP協議
- 要分析Fiddler抓取的數據包,我們首先要熟悉HTTP協議。HTTP即超文本傳輸協議,是一個基於請求與響應模式的、無狀態的、應用層的協議,絕大多數的Web開發,都是構建在HTTP協議之上的Web應用。
- HTTP的工作過程:當我們請求一個超鏈接時,HTTP就開始工作了,客戶端先發送一個請求到服務器,請求內容包括:協議版本號、請求地址、請求方式、請求頭和請求參數;服務器收到請求后做相應的處理,並將響應數據返回到客戶端,響應內容包括:協議版本號、狀態碼和響應數據。前端根據響應數據做相應的處理,就是最終我們看到的內容。這些過程是HTTP自動完成的,我們只是輸入或點擊請求地址,然后查看前端給我們展示的內容。更多關於HTTP協議的介紹請參考:http://www.cnblogs.com/li0803/archive/2008/11/03/1324746.html
- 請求方式常用的有:GET、PUT、POST、DELETE。
- HTTP狀態碼主要分為5類:以1開頭的代表請求已被接受,需要繼續處理;以2開頭的代表請求已成功被服務器接收、理解、並接受;以3開頭的代表需要客戶端采取進一步的操作才能完成請求;以4開頭的代表了客戶端看起來可能發生了錯誤,妨礙了服務器的處理;以5開頭的代表了服務器在處理請求的過程中有錯誤或者異常狀態發生,也有可能是服務器意識到以當前的軟硬件資源無法完成對請求的處理。
- 常見的主要有:200:服務器成功處理了請求;404:未找到資源;500:內部服務器錯誤;503:服務器目前無法為請求提供服務;302:請求的URL已臨時轉移;304:客戶端的緩存資源是最新的,要客戶端使用緩存。
- 每個狀態碼的詳細介紹請參考:https://baike.baidu.com/item/HTTP%E7%8A%B6%E6%80%81%E7%A0%81/5053660?fr=aladdin
Fiddler的使用
- Fiddler是一個很好用的抓包工具,可以將網絡傳輸發送與接收的數據包進行截獲、重發、編輯等操作。也可以用來檢測流量。
- Fiddler安裝后,設置的端口默認為8888,當Fiddler啟動后,默認將IE的代理設為了127.0.0.1:8888,而其他如火狐瀏覽器需要手動設置代理后才可以抓包。設置內容如圖:
1)要使用Fiddler進行抓包,首先需要確保Capture Traffic是開啟的(安裝后是默認開啟的),勾選File->Capture Traffic,也可以直接點擊Fiddler界面左下角的圖標開啟和關閉抓包。
2)所以基本上不需要做什么配置,安裝后就可以進行抓包了。那么我們怎么分析抓到的這些數據包呢?如圖所示的區域為數據包列表,要分析這些數據包,首先要了解各字段的含義。
#:順序號,按照抓包的順序從1遞增
Result:HTTP狀態碼
Protocol:請求使用的協議,如HTTP/HTTPS/FTP等
HOST:請求地址的主機名或域名
URL:請求資源的位置
Body:請求大小
Caching:請求的緩存過期時間或者緩存控制值
Content-Type:請求響應的類型
Process:發送此請求的進程ID
Comments:備注
Custom:自定義值
3)每個Fiddler抓取到的數據包都會在該列表中展示,點擊具體的一條數據包可以在右側菜單點擊Insepector查看詳細內容。主要分為請求(即客戶端發出的數據)和響應(服務器返回的數據)兩部分。
4)HTTP Request Header:以百度為例,查看請求百度主頁這條數據包的請求數據,從上面的Headers中可以看到如下內容:
請求方式:GET
協議: HTTP/1.1
Client 頭域:
Accept: text/html, application/xhtml+xml, image/jxr, */* ---------瀏覽器端可以接受的媒體類型
Accept-Encoding: gzip, deflate ---------壓縮方法
Accept-Language: zh-CN ---------語言類型
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/14.14393 ---------客戶端使用的操作系統和瀏覽器的名稱和版本
COOKIE頭域:將cookie值發送給服務器
Transport 頭域:
Connection:當網頁打開完成后,客戶端和服務器之間用於傳輸HTTP數據的TCP連接是否關閉。keep-alive表示不會關閉,客戶端再次訪問這個服務器上的網頁,會繼續使用這一條已經建立的連接;close表示關閉,客戶端再次訪問這個服務器上的網頁,需要重新建立連接。
HOST:主機名或域名,若沒有指定端口,表示使用默認端口80.
5)HTTP Response Header:繼續以百度為例,如圖所示:
協議:HTTP/1.1
狀態碼:200
Cache頭域:
Cache-Control: private ---------此響應消息不能被共享緩存處理,對於其他用戶的請求無效
Date: Sat, 05 Aug 2017 04:37:43 GMT ---------生成消息的具體時間和日期
Expires: Sat, 05 Aug 2017 04:37:42 GMT ---------瀏覽器會在指定過期時間內使用本地緩存
Cookie/Login 頭域:
Set-Cookie: BDSVRTM=264; path=/ ---------把cookie發送到客戶端
Set-Cookie: BD_HOME=1; path=/
Set-Cookie: H_PS_PSSID=1425_21097_22157; path=/; domain=.baidu.com
Entity頭域
Content-Length: 202740 ---------正文長度
Content-Type: text/html;charset=utf-8 ---------告知客戶端服務器本身響應的對象的類型和字符集
Miscellaneous 頭域:
Bdpagetype: 2
Bdqid: 0x99791efd00036253
Bduserid: 2577220064
Server: BWS/1.1 ---------指明HTTP服務器的軟件信息
X-Ua-Compatible: IE=Edge,chrome=1
Security頭域:
Strict-Transport-Security: max-age=172800 ---------基於安全考慮而需要發送的參數,關於這個參數的解釋,請參考:http://www.freebuf.com/articles/web/66827.html
Transport頭域:
Connection: Keep-Alive
6)TextView:顯示請求或響應的數據。
7)WebForms:請求部分以表單形式顯示所有的請求參數和參數值;響應部分與TextView內容是一樣的。
8)Auth:顯示認證信息,如Authorization
9)Cookies:顯示所有cookies
10)Raw:顯示Headers和Body數據
11)JSON:若請求或響應數據是json格式,以json形式顯示請求或響應內容
12)XML:若請求或響應數據是xml格式,以xml形式顯示請求或響應內容
13)上面是以百度主頁為例,百度主頁采用的是GET請求,在TextView中沒有請求body,我們再以無憂行網站登錄接口為例,它是一個POST請求,除了請求頭外,在TextView中多了請求數據。這也是GET請求和POST請求的一個區別。GET請求是將請求參數放在url中,而POST請求一般是將請求參數放在請求body中。
總結:通過Fiddler可以抓取請求和響應參數,通過對參數進行分析,可以定位是前端還是后台問題。例如我們在測試登錄接口時,輸入了正確的手機號和密碼,但前端提示“請輸入正確的用戶名和密碼”;僅僅通過界面提示我們只能描述bug表象,但不能分析出問題原因。假設通過抓包我們發現是由於前端參數名錯誤或參數值為空,從而導致后台報錯。這個時候我們將bug指向前端開發人員,並將參數數據和接口文檔中對應的報文數據作為附件上傳,是不是可以提高bug的解決效率呢?Fiddler在實際的功能測試中有很大的作用,一方面幫助我們更好的了解某個業務中客戶端和服務器端是通過哪些接口進行請求的,從而更好的了解代碼邏輯;另一方面,我們還可以通過響應數據判斷哪里出現了問題,例如可能服務器程序掛了,導致前端報“服務器故障”,這時我們通過抓包發現響應數據返回502,這時我們可以手動去重啟服務或是聯系運維重啟服務,從而提高問題的解決效率。
在上一篇中介紹了Fiddler的基本使用方法。通過上一篇的操作我們可以直接抓取瀏覽器的數據包。但在APP測試中,我們需要抓取手機APP上的數據包,應該怎么操作呢?
Andriod配置方法:
1)確保手機和Fiddler所在主機在同一個局域網中
2)獲取Fiddler所在主機的ip地址,通過cmd命令進入命令編輯器,輸入ipconfig -all,找到IPv4地址,記下該地址
3)對手機所連接的無線網絡進行設置,點擊WLAN,長按與Fiddler所在主機在同一個局域網的wifi,長按點擊【修改網絡】,選中【顯示高級選項】,代理設置為手動,輸入代理服務器的主機名和端口后保存。代理服務器的主機名即2)中的IPv4地址,端口為Fiddler上配置的端口(默認為8888),可以到Fiddler菜單欄中【Tool】-【Fiddler Option】的【Connections】中查看。
4)在手機瀏覽器上輸入:http://IPv4地址:端口(例如:http://192.168.11.29:8888),點擊【FiddlerRoot certificate】下載安裝Fiddler證書。
5)若在瀏覽器上無法打開該地址,需要做兩項檢查:一、確保在瀏覽器、wifi中配置的代理與Fiddler所在主機地址和Fiddler中配置的端口,三者保持一致;二、確保在Fiddler-【Tools】-【Fiddler Option]-[Connection]中【Allow remote computers to connect】已經勾選上,若沒有勾選,則需要勾選后保存並重啟Fiddler。
6)這時我們打開手機上的瀏覽器或APP,可以在Fiddler上看到手機上的數據包了。
IOS配置方法:
1)基本與andriod的配置方法一致,除了安裝證書方式與andriod略有不同,另外ios在下載證書后,需要手動信任證書。設置方法:打開【設置】-【通用】-【關於本機】-【證書信任證書】,找到對應的證書,啟用即可。
HTTPS抓包
上面都是針對HTTP協議進行抓包的設置,那么HTTPS需要進行什么配置呢?
1)打開Fiddler-【Tools】-【Fiddler Option】,切換到HTTPS選項卡,勾選【Capture HTTPS CONNECTs】和【Decrypt HTTPS traffic】,然后點擊【Actions】-【Trust Root Certificate】,然后按照提示一路yes,直到彈框提示“Trust Cert success”點擊確定后,重啟Fiddler就可以抓取HTTPS協議的數據包了。



Fiddler過濾會話
我們在使用Fiddler進行抓包時,發現只要是使用了Fiddler代理服務器的所有HTTP/HTTPS數據包都會在Fiddler數據列表中顯示出來,但有時我們只關注從某個或某些服務器發出的請求,不想要看到其他服務器的數據包,應該怎么進行設置呢?我們都知道Fiddler是一款強大的抓包工具,我們可以通過設置來過濾只篩選出我們想要的數據包。
1)在右側菜單中,找到Fittlers選項,共有9個部分進行設置
2)Use Filters:勾選則表示使用過濾,不勾選則表示不進行過濾
3)Actions:有四個選項,Run Filterset now:立即運行過濾設置;Load Filterset:加載保存的過濾設置;Save Filterset:保存過濾設置;help:幫助
4)Hosts:該設置項有兩個選項
- 第一個下拉框是只顯示內網或者外網選項
- 第二個下拉框是根據主機名信息顯示或者隱藏或者標記指定請求
5)Client Process:有三個選項,Show only traffic from:根據進程信息進行過濾,選擇后,將只顯示由該進程發出的請求;Show only Internet Explorer traffic:只關心由IE瀏覽器發出的請求;Hide traffic from Service Host:隱藏來自service host(即由svchost.exe進程發出)的請求
6)Request Headers:有五個選項,Show only if URL contains:可以通過正則表達式過濾請求地址中包含或不包含的內容,例如REGEX:\.(js|css|js\?.*|css\?.*)$(隱藏所有js和css請求);Hide if URL contains:與Show only if URL contains相反,一個是顯示,一個是隱藏;Flags requests with headers:支持指定某個http請求頭名稱,如果在web session列表中存在該請求頭,會加粗顯示該session;Delete requests headers:與Flags requests with headers類似,這里是如果包含該請求頭,則刪除該請求頭;Set request header:將HTTP請求頭更新為所輸入的值。
7)Breakpoints:斷點設置,有四個選項。Break request on POST:對POST請求設置斷點;Break request on GET with query string:會為所有方法為GET且URL中包含了給定查詢條件的請求設置斷點;Break on XMLHttpRequest:對所有能夠確定是通過XMLHTTPRequest對象發送的請求設置斷點;Break response on Content-Type:會為所有響應頭Content-Type中包含了指定文本的響應設置響應斷點。
8)Response Status Code:根據響應狀態碼設置斷點。
9)Response Type and Size:有幾種類型,一類是根據響應數據的類型顯示或隱藏;一類是根據響應數據的大小顯示或隱藏;一類是根據響應所需要的時間設置背景顏色;一類是根據文件類型進行限制。
- type有以下幾種類型:
- Time HeatMap復選框會基於服務器返回給定響應所需要的時間為每個session設置背景顏色。
10)Response Headers:與Request Headers不同的是,這塊區域是針對響應數據的頭部進行過濾。
這么多設置項,比較常用的就是1.2.3部分。通過過濾設置,可以快速的幫助我們找到我們需要抓包分析的數據包,從而提高效率,避免過多的數據包信息干擾我們找到正確的數據包。
我們知道Fiddler是位於客戶端和服務器之間的代理,它能夠記錄客戶端和服務器之間的所有 HTTP請求,可以針對特定的HTTP請求,分析請求數據、設置斷點、調試web應用、修改請求的數據,甚至可以修改服務器返回的數據,功能非常強大,是web調試的利器。前面我們介紹了如何使用Fiddler進行抓包和分析,以及如何抓取APP上的數據包。這里我們介紹下如何修改請求和響應數據,也就是設置斷點。
對request設置斷點
1)通過菜單選項或快捷鍵F11進行設置,如圖
當我們設置斷點后,進行HTTP請求,數據包順序列會有中斷的標記,單擊該數據包可以看到在右側會增加一行操作欄。這個時候我們在前端是沒有正常加載網頁的,點擊【Run to Completion】后可以返回響應數據。
接下來為了看我們的斷點設置是否生效,我們以登錄為例子進行測試。登錄無憂行網站,輸入正確的用戶名和密碼,點擊登錄。我們斷點規則設置為before request,然后將密碼清空,看看服務器給我們返回了什么響應數據。
繼續以登錄為例子,這次我們將手機號改成非移動賬號進行登錄。
由此可見,我們的斷點已經設置成功,並且成功修改了HTTP的請求數據。
2)通過菜單選項或快捷鍵進行設置時,會將所有的HTTP請求都設置斷點,但有時我們只想針對某個服務器發出的請求設置斷點,應該怎么操作呢?Fiddler是支持命令操作的,我們可以通過“bpu 服務器地址”命令來對特定的請求設置斷點。
在下圖所示的位置輸入命令,然后回車運行。
這個時候從該服務器發出的所有請求都會被中斷,而從其他服務器發出的請求可以正常響應。
如果要清除原來的斷點,可以在命令行輸入“bpu”,就會清除所有的斷點。
對response設置斷點
1)同樣的也可以通過菜單選項或快捷鍵alt+F11進行設置
2)通過命令“bpafter 服務器地址”
我們也用一個實例來驗證通過設置斷點修改響應數據。以百度主頁為例,我們攔截到響應數據中的title值為”百度一下,你就知道“,我們將響應數據中的title改成”test百度一下,你就知道“,然后在前端看看最終展示的是什么數據。
通過幾個實例,更好的幫助我們理解斷點的含義,也鞏固了Fiddler作為代理服務器的概念。接下來我們再來說說,Fiddler另一個很實用的功能:Fiddler的編碼和解碼。
Fiddler的編碼和解碼
1)響應body解碼
有時候我們在Fiddler上看到響應數據是幾個亂碼字符,首先我們可以點擊,上方黃色提示區域直接進行解碼。如下面的兩個圖所示。
2)請求和響應數據解碼
有的時候,基於安全性考慮,開發人員會將請求和響應的body根據一定規則進行解碼。如果是普通的編碼規則,我們可以直接通過Fiddler操作進行解碼。例如在登錄百度網站的時候,有個參數的值是一個url地址,這個url經過urlEncode進行轉碼了。我們就可以將該參數通過urlDecode進行解碼。
首先,找到這個參數,選中后右鍵選擇【send to TextWizard】
然后,在【transform】中找到【URLDecode】,字段值就被成功解碼,我們就可以很清楚的看到里面有哪些參數以及參數的值是什么了。
上面都是解碼的例子,編碼在實際運用中很少,就不介紹了。另外里面還有很多其他的編碼/解碼方法,就不一一舉例啦~~
手機用fiddler抓包
電腦最好是筆記本,這樣能和手機保持統一局域網內;其他不多說,直接說步驟了。
一.對PC(筆記本)參數進行配置
1. 配置fiddler允許監聽到https(fiddler默認只抓取http格式的)
打開Fiddler菜單項Tools->TelerikFiddler Options->HTTPS,
勾選CaptureHTTPS CONNECTs,點擊Actions,
勾選Decrypt HTTPS traffic和Ignore servercertificate errors兩項,點擊OK(首次點擊會彈出是否信任fiddler證書和安全提示,直接點擊yes就行),見圖:
2.配置fiddler允許遠程連接
上一步窗口中點擊Tools->TelerikFiddler Options->Connections,勾選allow remote computers to connect,默認監聽端口為8888(下圖Fiddler listens on port就是端口號),若端口被占用可以設置成其他的,配置好后要重新啟動fiddler,如下圖:
點擊完成之后,PC端配置完成,接下來開始配置手機端,以安卓為例,iOS方法同安卓;
二.對手機端進行參數配置
首先要保證手機和電腦都處於同一個網絡;
然后要知道電腦的ip地址(當然這個電腦是安裝fiddler的電腦),電腦ip地址可通過cmd,輸入ipconfig查詢,或網絡共享中ipv4找到,我的是192.168.103.53,
再者要知道fiddler的端口號,Tools->TelerikFiddler Options->Connections,port中值就是端口號,一般默認為8888;接下來開始操作手機;
1.第一步:手機和電腦連接同一個網絡,打開手機瀏覽器,輸入http://ip:端口號,點擊前往;見下圖:
2.第二步:前往之后會跳轉到證書下載頁,見下圖:
點擊FiddlerRootcertificate下載證書;
3.第三步:點擊下載之后,安裝證書並起個名字,隨便寫就行,點擊確定;
4.第四步:要求設置一個手機密碼,自己設置一個,記住密碼就行,最后不用了去系統-安全-密碼中去掉即可;
5.第五步:更改手機無線網的代理
手機系統設置-無線網-點擊高級,代理選擇手動,主機名就是fiddler的電腦ip地址,端口號,就是fiddler的端口號,與瀏覽器中ip:端口號保持一致,點擊確定即可,
6.操作手機,電腦fiddler中會顯示一些http信息,成功;
三.其他
1.停止電腦對手機的網絡監控
系統設置-wifi,找到代理,去掉即可;
2.刪除手機中證書
安卓系統設置—安全—收信任的憑證—用戶,點擊證書刪除即可;
3.刪除手機上密碼
手機系統—安全—密碼,刪除系統密碼即可;