用Fiddler做反向代理

注意:本文不涉及HTTPS的場景

最近在弄公衆號開發,除了主動去調公衆號接口,還存在公衆號後臺要反過來調你的情形,攻受轉換一線間。對於回調的情況,想要知道對方是怎樣來請求的很有必要。此前經常用Fiddler抓取從本機出去的請求,非常好用,現在就想能不能反過來,讓它抓取進來的請求。搜索一番,答案是肯定的,而且官網就有文檔說這事:

http://docs.telerik.com/fiddler/configure-fiddler/tasks/usefiddlerasreverseproxy

本文實際上就是基於上述文檔的說明。

從文檔標題就能看出,實現反抓的原理本質上是把Fiddler配置成一個反向代理服務(Reverse Proxy)。關於反向代理是怎麼一回事請讀者自行了解,本文不贅述,簡單理解就是讓真實提供服務的網站躲在代理服務的背後,請求首先是到代理,再由代理轉發給背後的網站,再把網站的響應返回出去。基於這個原理,作爲代理的Fiddler當然就能拿到往返的數據。

文檔中說了三種做法來配置反向代理,但其實後面兩種並沒有方式上的區別,只是一個端口誰來用的抉擇問題~下面會講到,所以其實只有兩種方法:

一、註冊表指定端口法(不推薦,有弊端)

1、在HKEY_CURRENT_USER\SOFTWARE\Microsoft\Fiddler2下新增DWORD型的鍵值ReverseProxyForPort,十進制方式輸入要抓包的站點的端口,比如站點端口是80,弄完如圖:

2、打開Fiddler,菜單Tool > Options,Connections頁,確保Allow remote computers to connect選項勾選。如圖:

上面那個8888是Fiddler的web服務端口。重啓Fiddler,並保持捕獲狀態,此時從本機訪問http://127.0.0.1:8888就能訪問到端口爲80那個站點,同時可以看到Fiddler有捕獲到剛剛對80站點的請求。至於Allow...這個選項,是爲了讓別的電腦能訪問本機的8888端口,不勾的話,外部無法通過【http://局網or外網IPor域名:8888】訪問進來~當然,在此之前還要記得在網關把8888映射出去

注意:這個方法有個侷限,就是隻能以http://127.0.0.1或localhost或局網IP或計算機名:8888發起請求,不能是公網IP和域名,否則會造成循環捕獲,永遠不會返回響應,只能關閉Fiddler才能消停。

二、腳本改寫端口法

方法是通過菜單Rules > Customize Rules打開自定義腳本,在其中找到OnBeforeRequest方法,在裏面添加如下邏輯:

if (oSession.port == 8888) {
    oSession.port = 80;
}

改好的腳本如圖:

腳本所用的類庫是.Net無疑,但語法像C#又不完全是,應該有名堂,還請路過朋友指教。注意上述邏輯並不是照搬官方文檔,文檔中的邏輯與域名攸關,我改了一下,只關注端口,總之目的就是把本來對8888端口的請求修改爲對目標站點的請求,本例假定目標站點的端口是80。

同樣確保方法一中Allow...選項勾選。重開Fiddler並保持捕獲,此時就能無侷限的訪問http://*:8888了,同時可以看到捕獲成果。

官方文檔中列出的第3種做法,其實只是替換一下端口,上面的例子都是要求請求方把請求地址由原來的端口改爲8888,但有些時候請求方是你叫不動的,比如微信公衆號的網頁授權回調url,就要求不能帶端口號,你不可能填個http://xxx:8888上去,所以這就要讓Fiddler來佔用80端口,同時把網站的端口改成別的,最後仍然使用腳本法重寫端口。

-文畢-

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章