如何在Python中创建HTTP代理?本文带你了解如何使用 mitmproxy 框架使用 Python 构建 HTTP 代理,以及一些Python创建HTTP代理示例。
Python如何创建HTTP代理?一个网络代理服务器是中介的网络服务,用户可以连接到,并依靠他们的流量到其他服务器,代理服务器可以是不同类型的,要列出几个,主要有:
- 反向代理:隐藏你尝试连接的服务器地址的代理,除了明显的安全用例外,它们通常用于执行负载平衡任务,其中反向代理决定应该将请求转发到哪个服务器,和缓存。流行的反向代理是HAProxy、Nginx和Squid。
- 透明代理:这些是将你的数据转发到服务器的代理,在不提供任何匿名性的情况下,它们仍然使用代理的 IP 地址更改数据包的源 IP。它们可用于在企业网络上实施防病毒或互联网过滤,它们还可用于逃避基于源 IP 的简单禁令。
- 匿名代理:这些是向目标服务器隐藏你的身份的代理,它们主要用于匿名。
通过协议,代理也可以使用多种协议来完成它们的功能,最流行的是:
- HTTP Proxies:HTTP 协议支持代理服务器,CONNECT方法用于要求代理服务器与远程服务器建立隧道。
- Socks 代理:使用Kerberos进行身份验证的 Socks 协议也广泛用于代理。
相关:如何使用代理在 Python 中轮换 IP 地址。
Mitmproxy是一种现代的开源 HTTP/HTTPS 代理,它提供了广泛的功能、命令行实用程序、Web 界面和用于脚本编写的 Python API。在本教程中,我们将使用它来实现一个代理,该代理将 HTML 和 Javascript 代码添加到我们访问的特定网站,我们还使其适用于 HTTP 和 HTTPS。
首先,我们需要安装mitmproxy
,在基于 Debian 的系统上可以使用以下命令轻松完成:
$ sudo apt install mitmproxy
虽然强烈建议你使用 Linux 机器,但你也可以mitmproxy
在mitmproxy 官方网站上的 Windows 上安装。
如何在Python中创建HTTP代理?在本教程中,我们将编写一个简单的代理,为我们访问的某些页面添加一个覆盖层,通过向 HTTP 响应添加一个覆盖层 HTML 代码来防止用户点击页面上的任何内容。
下面是Python创建HTTP代理示例:
OVERLAY_HTML = b"<img style='z-index:10000;width:100%;height:100%;top:0;left:0;position:fixed;opacity:0.5' src='https://cdn.winknews.com/wp-content/uploads/2019/01/Police-lights.-Photo-via-CBS-News..jpg' />"
OVERLAY_JS = b"<script>alert('You can\'t click anything on this page');</script>"
def remove_header(response, header_name):
if header_name in response.headers:
del response.headers[header_name]
def response(flow):
# remove security headers in case they're present
remove_header(flow.response, "Content-Security-Policy")
remove_header(flow.response, "Strict-Transport-Security")
# if content-type type isn't available, ignore
if "content-type" not in flow.response.headers:
return
# if it's HTML & response code is 200 OK, then inject the overlay snippet (HTML & JS)
if "text/html" in flow.response.headers["content-type"] and flow.response.status_code == 200:
flow.response.content += OVERLAY_HTML
flow.response.content += OVERLAY_JS
Python如何创建HTTP代理?脚本检查响应是否包含 HTML 数据,响应代码是200 OK
,如果是,它会将 HTML 和 Javascript 代码添加到页面。
内容安全策略 (CSP)是指示浏览器仅加载来自特定来源的脚本的标头,我们将其删除以能够注入内联脚本或加载来自不同来源的脚本。
该HTTP严格传输安全(HSTS)头告诉浏览器只能通过HTTPS在未来连接到这个网站,如果浏览器获得这个头,没有人在这方面的中间人将有可能将于何时acessing这个网站,直到 HSTS 规则到期。
我们将上述脚本保存在名称 proxy.py 下,并通过 mitmproxy 命令执行:
$ mitmproxy --ignore '^(?!duckduckgo\.com)' -s proxy.py
该--ignore
标志告诉 mitmproxy 不代理任何域duckduckgo.com
(否则,在获取任何跨域资源时,证书将无效,这可能会破坏网页),正则表达式是一个否定的前瞻。
现在代理监听地址localhost:8080
,我们必须告诉我们的浏览器使用它,或者使用iptables
Linux 中的工具将流量透明地重定向到它。
在 Firefox 浏览器中,可以从网络设置中完成:
Python创建HTTP代理示例:但是如果我们想让代理为我们系统中的每个应用程序工作,我们将不得不使用iptables
(在 Linux 系统的情况下)将所有 TCP 流量重定向到我们的代理:
$ iptables -t nat -A OUTPUT -p tcp --match multiport --dports 80,443 -j REDIRECT --to-ports 8080
如何在Python中创建HTTP代理?现在转到你的浏览器并访问duckduckgo.com
。当然,如果网站使用的是 HTTPS(确实如此),我们会收到证书警告,因为 mitmproxy 会生成自己的证书才能修改 HTML 代码:
但是如果站点还没有预加载到 HSTS 预加载列表中(如果是这样,浏览器将不允许绕过警告),我们可以继续访问该页面:
curl
命令来检查你的代理是否确实在工作:
$ curl -x http://127.0.0.1:8080/ -k https://duckduckgo.com/
如果它工作正常,你将在最后看到注入的代码,如下图所示:
结论
如何在Python中创建HTTP代理?请注意,该脚本可以用于 mitmproxy 支持的不同代理模式,包括常规、透明、socks5、反向和上游代理。
Mitmproxy 不仅限于 HTTP 代理,我们还可以以非常相似的方式代理 websocket 数据,甚至原始 TCP 数据。