Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erläuterung des HTTP-Proxys von Python

Detaillierte Erläuterung des HTTP-Proxys von Python

高洛峰
高洛峰Original
2017-03-21 10:04:452028Durchsuche

0x00 Vorwort

Jeder sollte mit dem in vielerlei Hinsicht weit verbreiteten HTTP-Proxy bestens vertraut sein. HTTP-Proxys werden in Forward-Proxys und Reverse-Proxys unterteilt. Letztere werden im Allgemeinen verwendet, um Benutzern Zugriff auf Dienste hinter der Firewall zu gewähren. Typische Proxys sind Nginx, HAProxy usw. In diesem Artikel werden Forward-Proxys behandelt.

Die häufigsten Verwendungszwecke von HTTP-Proxys sind die gemeinsame Nutzung von Netzwerken, die Netzwerkbeschleunigung und das Durchbrechen von Netzwerkgrenzen usw. Darüber hinaus wird HTTP-Proxy auch häufig für das Debuggen von Webanwendungen und die Überwachung und Analyse von Web-APIs in Android /IOS-APPs verwendet. Derzeit bekannte Software umfasst Fiddler, Charles, Burp Suite und mitmproxy usw. HTTP-Proxy kann auch verwendet werden, um Anforderungs-/Antwortinhalte zu ändern, zusätzliche Funktionen zu Webanwendungen hinzuzufügen oder das Anwendungsverhalten zu ändern, ohne den Server zu ändern.

0x01 Was ist HTTP-Proxy?

HTTP-Proxy ist im Wesentlichen eine Webanwendung und unterscheidet sich nicht grundlegend von anderen gewöhnlichen Webanwendungen. Nach Erhalt der Anfrage ermittelt der HTTP-Proxy umfassend den Zielhost anhand des Hostnamens des Host-Felds im

Header und der Get/POST-Anfrage-Adresse und richtet ein neues HTTP ein Anfrage, leitet die Anfragedaten weiter und die empfangenen Antwortdaten werden an den Client weitergeleitet.

Wenn die Anfrageadresse eine absolute Adresse ist, verwendet der HTTP-Proxy den Host in der Adresse, andernfalls wird das HOST-Feld im Header verwendet. Führen Sie einen einfachen Test durch, vorausgesetzt, die Netzwerkumgebung ist wie folgt:

  • 192.168.1.2 Webserver

  • 192.168.1.3 HTTP-Proxyserver

Verwenden Sie Telnet zum Testen

$ telnet 192.168.1.3
GET / HTTP/1.0
HOST: 192.168.1.2
Beachten Sie, dass am Ende zwei aufeinanderfolgende Wagenrückläufe erforderlich sind, was eine Anforderung des HTTP-Protokolls ist. Nach Abschluss können Sie den Seiteninhalt von http://192.168.1.2/ erhalten. Nehmen wir einige Anpassungen vor. Beachten Sie, dass der HOST ebenfalls auf 192.168.1.2 eingestellt ist, das laufende Ergebnis jedoch den Inhalt von http://httpbin zurückgibt .org/ip-Seite, also Informationen zur IP-Adresse des öffentlichen Netzwerks.

Wie aus dem obigen Testprozess ersichtlich ist, ist der HTTP-Proxy keine sehr komplizierte Sache, solange die ursprüngliche Anfrage an den Proxyserver gesendet wird. Wenn für eine kleine Anzahl von Hosts, die einen HTTP-Proxy benötigen, kein HTTP-Proxy festgelegt werden kann, besteht die einfachste Möglichkeit darin, die IP des Zielhostdomänennamens auf den Proxyserver zu verweisen. Dies kann durch Ändern der Hosts-Datei erreicht werden.
$ telnet 192.168.1.3
GET http://httpbin.org/ip HTTP/1.0
HOST: 192.168.1.2

0x02

Python

HTTP-Proxy im Programm festlegen

urllib2/urllib-Proxy-Einstellungenurllib2 ist eine Python-Standardbibliothek mit sehr leistungsstarken Funktionen, aber sie ist es Nur ein wenig schwierig zu bedienen. In Python 3 wird urllib2 nicht mehr beibehalten und in das Modul urllib verschoben. In urllib2 wird ProxyHandler zum Einrichten des Proxyservers verwendet.

Sie können install_opener auch verwenden, um den konfigurierten Opener

in der globalen Umgebung zu installieren, sodass alle urllib2.urlopen automatisch den Proxy verwenden.
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())

Verwenden Sie in Python 3 urllib.

urllib2.install_opener(opener)
r = urllib2.urlopen('http://httpbin.org/ip')
print(r.read())
Proxy-Einstellungen für Anfragen

Requests ist derzeit eine der besten HTTP-Bibliotheken und auch die Bibliothek, die ich beim Erstellen von HTTP-Anfragen am häufigsten verwende. Das API-Design ist sehr benutzerfreundlich und einfach zu verwenden. Das Einrichten von Proxys für Anfragen ist sehr einfach. Sie müssen lediglich einen Parameter in der Form
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())
für Proxys festlegen. Unter diesen sind http und https unabhängig voneinander.

kann das Proxy-{'http': 'x.x.x.x:8080', 'https': 'x.x.x.x:8080'}-Attribut

der
In [5]: requests.get('http://httpbin.org/ip', proxies={'http': '121.193.143.249:80'}).json()
Out[5]: {'origin': '121.193.143.249'}
Sitzung

direkt festlegen, wodurch die Mühe entfällt, in jeder Anfrage Proxy-Parameter anzugeben. 0x03 HTTP_PROXY / HTTPS_PROXY-Umgebung Variablen

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

Sowohl die Bibliotheken urllib2 als auch Requests erkennen die Umgebungsvariablen HTTP_PROXY und HTTPS_PROXY und setzen sie automatisch, sobald sie erkannt werden ein Stellvertreter. Dies ist beim Debuggen mit HTTP-Proxy sehr nützlich, da Sie die IP-Adresse und den Port des Proxyservers entsprechend den Umgebungsvariablen anpassen können, ohne den Code zu ändern. Die meiste Software in *nix unterstützt auch die Erkennung von HTTP_PROXY-Umgebungsvariablen wie Curl, Wget, Axel, Aria2c usw.

In der interaktiven IPython-Umgebung müssen Sie möglicherweise häufig HTTP-Anfragen vorübergehend debuggen. Sie können einfach

festlegen, um den HTTP-Proxy hinzuzufügen/abzubrechen.

$ 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"
}

0x04 MITM-Proxyos.environ['http_proxy']

MITM stammt aus Man-in-the-Middle-Angriff, was sich auf Man-in-the-Middle-Angriffe bezieht, die im Allgemeinen abfangen, überwachen und abfangen im Netzwerk zwischen dem Client und dem Server Manipulation von Daten.
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'}

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,用于给公司内部网站增加功能、改善用户体验,以后有机会再和大家分享。

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung des HTTP-Proxys von Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn