首頁 後端開發 Python教學 玩Python之HTTP代理

玩Python之HTTP代理

Nov 08, 2016 am 10:28 AM
http代理 python

0x00 前言

大家對HTTP代理應該都非常熟悉,它在許多方面都有著極為廣泛的應用。 HTTP代理分為正向代理和反向代理兩種,後者一般用於將防火牆後面的服務提供給用戶存取或進行負載平衡,典型的有Nginx、HAProxy等。本文所討論的是正向代理。

HTTP代理最常見的用途是用於網路共享、網路加速和網路限制突破等。此外,HTTP代理也常用於Web應用偵錯、Android/IOS APP 所呼叫的Web API監控與分析,目前知名的軟體有Fiddler、Charles、Burp Suite和mitmproxy等。 HTTP代理也可用於請求/回應內容修改,在不改變服務端的情況下為Web應用程式增加額外的功能或改變應用行為等。

0x01 HTTP代理是什麼

HTTP代理本質上是一個Web應用,它和其他普通Web應用沒有根本區別。 HTTP代理收到請求後,根據Header中Host欄位的主機名稱和Get/POST請求地址綜合判斷目標主機,建立新的HTTP請求並轉送請求數據,並將收到的回應資料轉送至客戶端。

如果請求位址是絕對位址,HTTP代理採用該位址中的Host,否則使用Header中的HOST欄位。做一個簡單測試,假設網路環境如下:

192.168.1.2 Web伺服器

192.168.1.3 HTTP代理伺服器

使用telnet進行測試

$ telnet 192.168.1.3
GET / HTTP/1.0
HOST: 192.168.1.2
登入後複製

。完成後,可以收到 http://192.168.1.2/的頁面內容。下面做一下調整,GET請求時帶上絕對地址

$ telnet 192.168.1.3
GET http://httpbin.org/ip HTTP/1.0
HOST: 192.168.1.2
登入後複製

注意這裡同樣設定了HOST為192.168.1.2,但運行結果卻回傳了 http://httpbin.org/ip 頁面的內容,也就是公版網IP位址資訊。

從上面的測試過程可以看出,HTTP代理並不是什麼很複雜的東西,只要將原始請求發送到代理伺服器即可。在無法設定HTTP代理的情況下,對於少量Host需要走HTTP代理的場景來說,最簡單的方式就是將目標Host網域的IP指向代理伺服器,可以採取修改hosts檔案的方式來實現。

0x02 Python程式中設定HTTP代理程式

urllib2/urllib 代理程式設定

urllib2是Python標準函式庫,功能很強大,只是使用起來稍微麻煩一點。在Python 3中,urllib2不再保留,遷移到了urllib模組中。 urllib2中透過ProxyHandler來設定使用代理伺服器。

   
proxy_handler = urllib2.ProxyHandler({'http': '121.193.143.249:80'})
opener = urllib2.build_opener(proxy_handler)
r = opener.open('http://httpbin.org/ip')
print(r.read())
登入後複製

也可以用install_opener將配置好的opener安裝到全域環境中,這樣所有的urllib2.urlopen都會自動使用代理

urllib2.install_opener(opener)
r = urllib2.urlopen('http://httpbin.org/ip')
print(r.read())
登入後複製

proxy_handler = urllib.request.ProxyHandler({'http': 'http://121.193.143.249:80/'})
opener = urllib.request.build_opener(proxy_handler)
r = opener.open('http://httpbin.org/ip')
print(r.read())
登入後複製

requests 代理設定

requests是目前最優秀的HTTP函式庫之一,也是我平時建構http請求時使用最多的函式庫。它的API設計非常人性化,使用起來很容易上手。為requests設定代理程式很簡單,只需為proxies設定一個形如 {'http': 'x.x.x.x:8080', 'https': 'x.x.x.x:8080'} 的參數即可。其中http和https相互獨立。

In [5]: requests.get('http://httpbin.org/ip', proxies={'http': '121.193.143.249:80'}).json()
Out[5]: {'origin': '121.193.143.249'}
登入後複製

可以直接設定session的proxies屬性,省去每次要求都要帶上proxies參數的麻煩。

   
s = requests.session()
s.proxies = {'http': '121.193.143.249:80'}
print(s.get('http://httpbin.org/ip').json())
登入後複製

0x03 HTTP_PROXY / HTTPS_PROXY 環境變數

urllib2 和 Requests 函式庫都能辨識 HTTP_PROXY 和 HTTPS_PROXY 環境變量,一旦偵測到這些環境變數就會自動設定使用代理。這在用HTTP代理程式進行偵錯的時候非常有用,因為不用修改程式碼,可以隨意根據環境變數來調整代理伺服器的ip位址和連接埠。 *nix中的軟體也大多支援HTTP_PROXY環境變數識別,例如curl、wget、axel、aria2c等。

$ http_proxy=121.193.143.249:80 python -c 'import requests; print(requests.get("http://httpbin.org/ip").json())'
{u'origin': u'121.193.143.249'}
 
$ http_proxy=121.193.143.249:80 curl httpbin.org/ip
{
  "origin": "121.193.143.249"
}
登入後複製

在IPython交互環境中,可能經常需要臨時性地調試HTTP請求,可以簡單透過設定 os.environ['http_proxy'] 增加/取消HTTP代理來實現。

   
In [245]: os.environ['http_proxy'] = '121.193.143.249:80'
In [246]: requests.get("http://httpbin.org/ip").json()
Out[246]: {u'origin': u'121.193.143.249'}
In [249]: os.environ['http_proxy'] = ''
In [250]: requests.get("http://httpbin.org/ip").json()
Out[250]: {u'origin': u'x.x.x.x'}
登入後複製

0x04 MITM-Proxy

MITM 源自 Man-in-the-Middle Attack,指中間人攻擊,一般在客戶端和伺服器之間的網路中攔截、監聽和竄改資料。

mitmproxy是一款Python語言開發的開源中間人代理神器,支援SSL,支援透明代理、反向代理,支援流量錄製回放,支援自訂腳本等。功能上同Windows中的Fiddler有些類似,但mitmproxy是一款console程序,沒有GUI介面,不過用起來還算方便。使用mitmproxy可以很方便的過濾、攔截、修改任意經過代理的HTTP請求/回應資料包,甚至可以利用它的scripting API,編寫腳本達到自動攔截修改HTTP資料的目的。

# test.py
def response(flow):
    flow.response.headers["BOOM"] = "boom!boom!boom!"
登入後複製

上面的脚本会在所有经过代理的Http响应包头里面加上一个名为BOOM的header。用mitmproxy -s 'test.py'命令启动mitmproxy,curl验证结果发现的确多了一个BOOM头。

$ http_proxy=localhost:8080 curl -I 'httpbin.org/get'
HTTP/1.1 200 OK
Server: nginx
Date: Thu, 03 Nov 2016 09:02:04 GMT
Content-Type: application/json
Content-Length: 186
Connection: keep-alive
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
BOOM: boom!boom!boom!
...
登入後複製

显然mitmproxy脚本能做的事情远不止这些,结合Python强大的功能,可以衍生出很多应用途径。除此之外,mitmproxy还提供了强大的API,在这些API的基础上,完全可以自己定制一个实现了特殊功能的专属代理服务器。

经过性能测试,发现mitmproxy的效率并不是特别高。如果只是用于调试目的那还好,但如果要用到生产环境,有大量并发请求通过代理的时候,性能还是稍微差点。我用twisted实现了一个简单的proxy,用于给公司内部网站增加功能、改善用户体验,以后有机会再和大家分享。

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1665
14
CakePHP 教程
1423
52
Laravel 教程
1321
25
PHP教程
1269
29
C# 教程
1249
24
PHP和Python:解釋了不同的範例 PHP和Python:解釋了不同的範例 Apr 18, 2025 am 12:26 AM

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。

在PHP和Python之間進行選擇:指南 在PHP和Python之間進行選擇:指南 Apr 18, 2025 am 12:24 AM

PHP適合網頁開發和快速原型開發,Python適用於數據科學和機器學習。 1.PHP用於動態網頁開發,語法簡單,適合快速開發。 2.Python語法簡潔,適用於多領域,庫生態系統強大。

sublime怎麼運行代碼python sublime怎麼運行代碼python Apr 16, 2025 am 08:48 AM

在 Sublime Text 中運行 Python 代碼,需先安裝 Python 插件,再創建 .py 文件並編寫代碼,最後按 Ctrl B 運行代碼,輸出會在控制台中顯示。

PHP和Python:深入了解他們的歷史 PHP和Python:深入了解他們的歷史 Apr 18, 2025 am 12:25 AM

PHP起源於1994年,由RasmusLerdorf開發,最初用於跟踪網站訪問者,逐漸演變為服務器端腳本語言,廣泛應用於網頁開發。 Python由GuidovanRossum於1980年代末開發,1991年首次發布,強調代碼可讀性和簡潔性,適用於科學計算、數據分析等領域。

Python vs. JavaScript:學習曲線和易用性 Python vs. JavaScript:學習曲線和易用性 Apr 16, 2025 am 12:12 AM

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

Golang vs. Python:性能和可伸縮性 Golang vs. Python:性能和可伸縮性 Apr 19, 2025 am 12:18 AM

Golang在性能和可擴展性方面優於Python。 1)Golang的編譯型特性和高效並發模型使其在高並發場景下表現出色。 2)Python作為解釋型語言,執行速度較慢,但通過工具如Cython可優化性能。

vscode在哪寫代碼 vscode在哪寫代碼 Apr 15, 2025 pm 09:54 PM

在 Visual Studio Code(VSCode)中編寫代碼簡單易行,只需安裝 VSCode、創建項目、選擇語言、創建文件、編寫代碼、保存並運行即可。 VSCode 的優點包括跨平台、免費開源、強大功能、擴展豐富,以及輕量快速。

notepad 怎麼運行python notepad 怎麼運行python Apr 16, 2025 pm 07:33 PM

在 Notepad 中運行 Python 代碼需要安裝 Python 可執行文件和 NppExec 插件。安裝 Python 並為其添加 PATH 後,在 NppExec 插件中配置命令為“python”、參數為“{CURRENT_DIRECTORY}{FILE_NAME}”,即可在 Notepad 中通過快捷鍵“F6”運行 Python 代碼。

See all articles