如何在Python中创建HTTP代理?代码示例

2021年11月16日14:48:47 发表评论 1,028 次浏览

如何在Python中创建HTTP代理?本文带你了解如何使用 mitmproxy 框架使用 Python 构建 HTTP 代理,以及一些Python创建HTTP代理示例

Python如何创建HTTP代理?一个网络代理服务器是中介的网络服务,用户可以连接到,并依靠他们的流量到其他服务器,代理服务器可以是不同类型的,要列出几个,主要有:

  • 反向代理:隐藏你尝试连接的服务器地址的代理,除了明显的安全用例外,它们通常用于执行负载平衡任务,其中反向代理决定应该将请求转发到哪个服务器,和缓存。流行的反向代理是HAProxyNginxSquid
  • 透明代理:这些是将你的数据转发到服务器的代理,在不提供任何匿名性的情况下,它们仍然使用代理的 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 机器,但你也可以mitmproxymitmproxy 官方网站上的 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,我们必须告诉我们的浏览器使用它,或者使用iptablesLinux 中的工具将流量透明地重定向到它。

在 Firefox 浏览器中,可以从网络设置中完成:

如何在Python中创建HTTP代理?代码示例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 代码:

如何在Python中创建HTTP代理?代码示例但是如果站点还没有预加载到 HSTS 预加载列表中(如果是这样,浏览器将不允许绕过警告),我们可以继续访问该页面:

如何在Python中创建HTTP代理?代码示例

Python如何创建HTTP代理?如你所见,我们将无法在网站上执行任何操作,因为注入的 HTML 覆盖阻止了我们,你还可以通过运行以下curl命令来检查你的代理是否确实在工作:

$ curl -x http://127.0.0.1:8080/ -k https://duckduckgo.com/

如果它工作正常,你将在最后看到注入的代码,如下图所示:

如何在Python中创建HTTP代理?代码示例结论

如何在Python中创建HTTP代理?请注意,该脚本可以用于 mitmproxy 支持的不同代理模式,包括常规、透明、socks5、反向和上游代理。

Mitmproxy 不仅限于 HTTP 代理,我们还可以以非常相似的方式代理 websocket 数据,甚至原始 TCP 数据。

木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: