使用MITMProxy转发https请求到本地、保存鉴权给本地请求(二)

之前有篇文章讲了用mitmproxy转发请求到本地来进行验证 使用MITMProxy转发请求到本地、保存鉴权给本地请求现在在一家支付的公司,开发环境也使用了https,这里添加对https环境的支持

实现步骤

1. 安装 mitmproxy

2. 配置浏览器使用 mitmproxy

  • 启动 mitmproxy
  • 设置浏览器代理为 mitmproxy 的监听地址(默认为 127.0.0.1:8080)。
  • 未设置代理访问 mitm.it

     

  • 信任 mitmproxy 的根证书:
    • 访问 mitm.it 下载证书。
    • 将证书导入并信任(具体步骤根据浏览器而异)。
      • 选择证书存储位置。这决定了证书的信任范围——仅限当前的 Windows 用户,还是整个计算机上的所有用户。点击“下一步”。
      • 再次点击“下一步”。
      • 将密码字段留空,点击“下一步”。
      • 选择“将所有证书放入以下存储”,然后点击“浏览”,选择“受信任的根证书颁发机构”。
      • 点击“确定”,然后点击“下一步”。
      • 点击“完成”。
      • 点击“是”以确认警告对话框。

      3. 编写替换脚本

      通过编写一个 mitmproxy 脚本实现请求的拦截和替换。

      创建一个脚本 redirect_request.py,内容如下:

    • 1
      2
      3
      4
      5
      6
      7
      8
      9
      from mitmproxy import http
       
      def request(flow: http.HTTPFlow) -> None:
          # 检查请求的 URL
          if flow.request.pretty_url == "https://a.com/userInfo":
              # 修改目标 URL
              flow.request.host = "localhost"
              flow.request.port = 8080
              flow.request.scheme = "http"

      4. 运行 mitmproxy 脚本

      使用以下命令运行 mitmproxy 并加载脚本:

    • mitmproxy -s redirect_request.py

      5. 验证效果

      在浏览器中访问 https://a.com/userInfomitmproxy 会拦截请求并将其重定向到 http://localhost:8080/userInfo

允许跨域请求

如果 mitmproxy 转发请求时没有进行合适的 CORS 配置,可能导致浏览器出现跨域问题。你可以在 mitmproxy 中强制修改响应头来允许跨域请求。

例如,添加如下的 CORS 响应头:

复制代码
def response(flow: http.HTTPFlow) -> None:
    # 添加 CORS 响应头
    flow.response.headers["Access-Control-Allow-Origin"] = "*"
    flow.response.headers["Access-Control-Allow-Methods"] = "GET, POST, PUT, DELETE, OPTIONS"
    flow.response.headers["Access-Control-Allow-Headers"] = "Content-Type, Authorization"
    
# flow.response.headers["Access-Control-Allow-Headers"] = "*"
 
复制代码

CORS 策略:当你设置 Access-Control-Allow-Headers* 时,某些浏览器可能会对某些头部有额外的限制。比如,某些请求头(如 AuthorizationContent-Type)在 CORS 请求中是受到限制的,因此你需要根据需求确保服务器端接受这些请求头。

 

解决 strict-origin-when-cross-origin 错误

strict-origin-when-cross-origin 是一种浏览器的安全策略,限制了跨域请求中的 RefererOrigin 信息。浏览器在跨域请求时只会传递源(origin)而不会传递完整 URL。由于这个限制,浏览器可能会拒绝某些跨域请求。

解决方案

  • 服务器端:确保服务器支持 CORS,允许适当的 OriginReferer 头部。通过响应头中的 Access-Control-Allow-OriginAccess-Control-Allow-Methods,和 Access-Control-Allow-Headers 来配置允许的跨域源和方法。

  • mitmproxy 中修改请求头:如果是因为请求头中缺少合适的 OriginReferer,可以通过 mitmproxy 修改请求头,确保这些头部值被正确传递。

def request(flow: http.HTTPFlow) -> None:
    # 添加 Origin 和 Referer 头部
    flow.request.headers["Origin"] = "http://localhost:8080"
    flow.request.headers["Referer"] = "http://localhost:8080"

 

 
posted @   timseng  阅读(230)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
点击右上角即可分享
微信分享提示