如何使用 mitmproxy 修改 POST 请求中的 JSON 主体?

How do I modify the JSON Body in a POST request with mitmproxy?

我正在使用一个通过 POST 请求将数据发送到服务器的应用程序,

POST https://www.somedomain.com//sendImage HTTP/2.0

看起来像这样:

{
"user": {
    "consent": true,
    "currentNumberIs": 1,
    "images": {
        "data": "BASE64ENCODED IMAGE",
        "docType": "avatar"
    },
    "totalNumberOfImages": 1
}

}

我想替换这个 Json 的数据部分,但前提是 docType 是头像。尝试使用我在这里找到并编辑的 python 脚本:

def response(flow: http.HTTPFlow) -> None:
 if "somedomain.com" in flow.request.pretty_url:
    request_data = json.loads(flow.request.get_text())
    if request_data["user"]["images"]["docType"] == "avatar":
        data = json.loads(flow.response.get_text())
        data["user"]["images"]["data"] = "NEWDATA"
        flow.response.text = json.dumps(data)

用-s script.py启动了mitmproxy,但是根据web控制台,具体的请求根本不会触发脚本。这有点限制调试范围。

如果有任何帮助,我们将不胜感激。

您正在更改函数中的流变量,但未使用编辑后的流。如果您 return 新流程,您就可以使用它并 post 它。

def response(flow: http.HTTPFlow) -> http.HTTPFlow:
  if "somedomain.com" in flow.request.pretty_url:
    request_data = json.loads(flow.request.get_text())
    if request_data["user"]["images"]["docType"] == "avatar":
        data = json.loads(flow.response.get_text())
        data["user"]["images"]["data"] = "NEWDATA"
        flow.response.text = json.dumps(data)
  return flow

正如@nneonneo 在评论中提到的,我首先建议广泛使用 mitmproxy.ctx.log() 以确保您的事件挂钩被正确触发。第二,如果我理解正确的话,你打算修改请求而不是响应?如果你想在发送到服务器之前修改请求内容,你需要使用请求钩子而不是响应钩子:

def request(flow: http.HTTPFlow) -> None:
    # this is executed after we have received the request 
    # from the client, but before it is sent to the server.

def response(flow: http.HTTPFlow) -> None:
    # this is executed after we have sent the request 
    # to the server and received the response at the proxy.

最后,您当前从 flow.request.text 读取,然后分配给 flow.response.text。我不知道您的具体用例,但通常也应该是 flow.request.text