Maison > Article > développement back-end > Explication détaillée du proxy HTTP de Python
Tout le monde devrait être très familier avec le proxy HTTP, qui est largement utilisé dans de nombreux aspects. Les proxys HTTP sont divisés en proxys directs et proxys inverses. Ces derniers sont généralement utilisés pour fournir aux utilisateurs un accès aux services derrière le pare-feu ou pour l'équilibrage de charge. Les proxys typiques sont Nginx, HAProxy, etc. Cet article traite des proxys directs.
Les utilisations les plus courantes du proxy HTTP concernent le partage réseau, l'accélération du réseau et la rupture des limites du réseau, etc. De plus, le proxy HTTP est également couramment utilisé pour le débogage des applications Web et la surveillance et l'analyse API Web appelées dans application Android /IOS Actuellement, un logiciel bien connu. comprend Fiddler, Charles, Burp Suite et mitmproxy, etc. Le proxy HTTP peut également être utilisé pour modifier le contenu des requêtes/réponses, ajouter des fonctions supplémentaires aux applications Web ou modifier le comportement des applications sans changer de serveur.
Le proxy HTTP est essentiellement une application Web et il n'est pas fondamentalement différent des autres applications Web ordinaires. Une fois que le proxy HTTP a reçu la demande, il détermine de manière exhaustive l'hôte cible en fonction du nom d'hôte du champ Hôte dans le Header et de l'adresse Get/POST request, établit un nouveau Requête HTTP, transmet les données de la demande et les données de réponse reçues sont transmises au client.
Si l'adresse de la requête est une adresse absolue, le proxy HTTP utilise l'hôte dans l'adresse, sinon le champ HOST dans l'en-tête est utilisé. Faites un test simple, en supposant que l'environnement réseau est le suivant :
192.168.1.2 Serveur Web
192.168.1.3 Serveur proxy HTTP
Utilisez telnet pour tester
$ telnet 192.168.1.3 GET / HTTP/1.0 HOST: 192.168.1.2
Notez que deux retours chariot consécutifs sont requis à la fin, ce qui est une exigence du protocole HTTP. Une fois terminé, vous pouvez recevoir le contenu de la page http://192.168.1.2/. Faisons quelques ajustements. Apportez l'adresse absolue
$ telnet 192.168.1.3 GET http://httpbin.org/ip HTTP/1.0 HOST: 192.168.1.2
lors d'une requête GET. Notez que le HOST est également défini sur 192.168.1.2, mais le résultat en cours d'exécution renvoie le contenu du http://httpbin. .org/ip, c'est-à-dire les informations sur l'adresse IP du réseau public.
Comme le montre le processus de test ci-dessus, le proxy HTTP n'est pas une chose très compliquée, tant que la requête originale est envoyée au serveur proxy. Lorsqu'un proxy HTTP ne peut pas être défini, pour un scénario dans lequel un petit nombre d'hôtes nécessite un proxy HTTP, le moyen le plus simple consiste à faire pointer l'adresse IP du nom de domaine de l'hôte cible vers le serveur proxy, ce qui peut être réalisé en modifiant le fichier hosts. .
urllib2 est une bibliothèque standard Python avec des fonctions très puissantes, mais elle est juste un peu compliqué à utiliser. Dans Python 3, urllib2 n'est plus conservé et déplacé vers le module urllib. Dans urllib2, ProxyHandler est utilisé pour configurer le serveur proxy.
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())
Vous pouvez également utiliser install_opener pour installer l'ouvreur configuré dans l'environnement global, afin que tous les urllib2.urlopen utilisent automatiquement le proxy.
urllib2.install_opener(opener) r = urllib2.urlopen('http://httpbin.org/ip') print(r.read())
Dans Python 3, utilisez urllib.
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 est l'une des meilleures bibliothèques HTTP actuellement, et c'est aussi la bibliothèque que j'utilise le plus lors de la construction de requêtes http. Sa conception API est très conviviale et facile à utiliser. La configuration des proxys pour les requêtes est très simple. Il vous suffit de définir un paramètre sous la forme de {'http': 'x.x.x.x:8080', 'https': 'x.x.x.x:8080'}
pour les proxys. Parmi eux, http et https sont indépendants l’un de l’autre.
In [5]: requests.get('http://httpbin.org/ip', proxies={'http': '121.193.143.249:80'}).json() Out[5]: {'origin': '121.193.143.249'}
peut définir directement les proxysattribut de session, éliminant ainsi le problème d'introduire des paramètres de proxy dans chaque requête.
s = requests.session() s.proxies = {'http': '121.193.143.249:80'} print(s.get('http://httpbin.org/ip').json())
Les bibliothèques urllib2 et Requests reconnaissent les variables d'environnement HTTP_PROXY et HTTPS_PROXY et les définiront automatiquement une fois détectées. Utiliser un mandataire. Ceci est très utile lors du débogage avec un proxy HTTP, car vous pouvez ajuster l'adresse IP et le port du serveur proxy en fonction des variables d'environnement sans modifier le code. La plupart des logiciels dans *nix prennent également en charge la reconnaissance des variables d'environnement HTTP_PROXY, telles que curl, wget, axel, aria2c, etc.
$ 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" }
Dans l'environnement interactif IPython, vous devrez peut-être souvent déboguer temporairement les requêtes HTTP. Vous pouvez simplement configurer os.environ['http_proxy']
pour ajouter/annuler le 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'}
MITM provient de Man-in-the-Middle Attack, qui fait référence à l'attaque de l'homme du milieu. Il intercepte, surveille et intercepte généralement. dans le réseau entre le client et le serveur.
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,用于给公司内部网站增加功能、改善用户体验,以后有机会再和大家分享。
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!