5

我正在尝试使用 mitmproxy 和 Python 将一个页面重定向到另一个页面。我可以毫无问题地与 mitmproxy 一起运行我的内联脚本,但是在将 URL 更改为另一个 URL 时我被卡住了。就像我去 google.com 一样,它会重定向到 stackoverflow.com

def response(context, flow):
        print("DEBUG")
        if flow.request.url.startswith("http://google.com/"):
            print("It does contain it")
            flow.request.url = "http://stackoverflow/"

这在理论上应该有效。我http://google.com/在 mitmproxy 的 GUI 中看到(作为 GET),但从print("It does contain it")未被解雇。

当我尝试将其放在flow.request.url = "http://stackoverflow.com"正下方时,print("DEBUG")它也不起作用。

我究竟做错了什么?我还尝试if "google.com" in flow.request.url检查 URL 是否包含google.com,但这也不起作用。

谢谢

4

3 回答 3

9

以下mitmproxy脚本将

  1. 将 requesto 从 重定向mydomain.comnewsite.mydomain.com
  2. 更改请求方法路径(应该是类似于/getjson?新的`/getxml
  3. 更改目标主机方案
  4. 更改目标服务器端口
  5. 覆盖请求头Host伪装成origi

    import mitmproxy
    from mitmproxy.models import HTTPResponse
    from netlib.http import Headers
    def request(flow):
    
        if flow.request.pretty_host.endswith("mydomain.com"):
                mitmproxy.ctx.log( flow.request.path )
                method = flow.request.path.split('/')[3].split('?')[0]
                flow.request.host = "newsite.mydomain.com"
                flow.request.port = 8181
                flow.request.scheme = 'http'
                if method == 'getjson':
                    flow.request.path=flow.request.path.replace(method,"getxml")
                flow.request.headers["Host"] = "newsite.mydomain.com"
    
于 2016-07-26T14:39:17.057 回答
3

您可以设置.url属性,这将更新基础属性。查看您的代码,您的问题是您在response请求完成后更改了挂钩中的 URL。您需要更改request挂钩中的 URL,以便在从上游服务器请求资源之前应用更改。

于 2016-05-09T17:21:54.810 回答
2

设置url属性对您没有帮助,因为它只是从基础数据构建的。[编辑:我错了,见马克西米利安的回答。不过,我的其余答案应该仍然有效。]

根据您想要完成的具体任务,有两种选择。

(1) 您可以向客户端发送一个实际的 HTTP重定向响应。假设客户端理解 HTTP 重定向,它将向您提供的 URL 提交一个请求。

from mitmproxy.models import HTTPResponse
from netlib.http import Headers

def request(context, flow):
    if flow.request.host == 'google.com':
        flow.reply(HTTPResponse('HTTP/1.1', 302, 'Found',
                                Headers(Location='http://stackoverflow.com/',
                                        Content_Length='0'),
                                b''))

(2) 您可以将相同的请求静默路由到不同的主机。客户端不会看到这一点,它会假设它仍在与google.com.

def request(context, flow):
    if flow.request.url == 'http://google.com/accounts/':
        flow.request.host = 'stackoverflow.com'
        flow.request.path = '/users/'

这些片段改编自mitmproxy 自己的 GitHub 存储库中的一个示例。那里还有很多例子

出于某种原因,当与 TLS ( ) 一起使用时,我似乎无法使这些片段适用于 Firefox https://,但也许您不需要它。

于 2016-05-09T16:06:11.073 回答