使用 mitmproxy 来实现代理是一个非常强大的方法,因为它不仅支持 HTTP/HTTPS 流量的代理,还支持实时修改请求和响应内容。下面是如何使用 Python 和 mitmproxy 实现一个基本的代理服务器,并拦截和修改 HTTP 请求和响应的一个示例。

1. 安装 mitmproxy

首先,你需要安装 mitmproxy,可以通过以下命令安装:

pip install mitmproxy

2. 编写 mitmproxy 脚本

mitmproxy 允许你使用 Python 脚本来自定义代理行为,例如修改请求、响应或执行其他操作。以下是一个简单的示例,展示如何创建一个代理服务器,并拦截和修改请求或响应:

示例:修改请求 URL 和响应内容
  1. 创建 Python 脚本,例如 proxy_script.py
from mitmproxy import http

# 请求拦截和修改
def request(flow: http.HTTPFlow) -> None:
    """
    在请求到达目标服务器前,修改请求
    """
    # 示例:如果请求的 URL 包含 "example.com",则将其修改为 "new-example.com"
    if "example.com" in flow.request.pretty_url:
        flow.request.host = "new-example.com"
        print(f"Modified request URL: {flow.request.pretty_url}")

# 响应拦截和修改
def response(flow: http.HTTPFlow) -> None:
    """
    在响应返回给客户端前,修改响应
    """
    if flow.response.status_code == 200:
        # 示例:如果响应的状态码是 200,修改响应的内容
        flow.response.content = flow.response.content.replace(b"Hello", b"Hi")
        print(f"Modified response content: {flow.response.content[:50]}...")

说明:
  • request(flow):这是请求拦截函数,它在请求发送到目标服务器之前被调用。在这个函数里,你可以修改请求的 URL、头部、参数等。
  • response(flow):这是响应拦截函数,它在服务器响应返回给客户端之前被调用。你可以修改响应的内容、状态码、头部等。

3. 运行 mitmproxy 代理

运行以下命令来启动 mitmproxy,并使用你创建的 Python 脚本:

mitmdump -s proxy_script.py
  • mitmdumpmitmproxy 的命令行工具,它比 mitmproxy 提供了更简洁的文本输出。
  • -s 用于指定你编写的脚本(例如 proxy_script.py)。

此时,mitmproxy 会启动一个代理服务,监听默认的端口 8080,并拦截所有经过它的 HTTP/HTTPS 流量。

4. 配置客户端使用代理

为了使客户端的流量经过 mitmproxy,你需要将客户端的 HTTP/HTTPS 请求配置为使用 mitmproxy 代理。

  • 设置 HTTP/HTTPS 代理:将浏览器或应用程序的代理设置为 127.0.0.1:8080(默认的 mitmproxy 监听端口)。

5. 调试与检查

你可以在命令行中看到 mitmproxy 输出的详细信息,例如每个请求和响应的内容。

  • 当某个请求符合条件时,脚本会修改其 URL。
  • 如果响应状态码为 200,脚本会修改响应内容中的部分文字。

6. HTTPS 代理

如果你需要处理 HTTPS 流量,你需要为 mitmproxy 安装并信任其根证书。mitmproxy 会为 HTTPS 流量创建一个自签名证书,并使用该证书进行解密。你可以通过以下方式安装证书:

  1. 启动 mitmproxy 后,打开浏览器访问 http://mitm.it
  2. 根据页面提示下载并安装证书。
  3. 之后,mitmproxy 就可以解密并代理 HTTPS 流量了。

7. 自定义和扩展

mitmproxy 提供了许多扩展功能,允许你根据需要定制代理行为。你可以使用 Python 编写更多复杂的逻辑,例如:

  • 基于请求内容执行条件判断(例如,仅修改特定类型的请求)。
  • 存储和回放请求响应(进行流量重放或模拟)。
  • 记录请求和响应并导出为文件或日志,进行进一步分析。

总结

通过 mitmproxy,你可以轻松地创建一个功能强大的代理服务器,拦截和修改 HTTP/HTTPS 流量,适用于多种应用场景,如网络调试、流量分析、网络安全测试等。Python 脚本使得代理行为高度可定制,几乎可以处理任何你需要的操作。

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐