[PYTHON] Verwenden Sie Mitmproxy, um die API Ihrer App in eine Entwicklungsumgebung zu zwingen

Was ist Mitmproxy?

Mitmproxy ist ein HTTP-Proxyserver zum Durchsuchen und Manipulieren von HTTP-Anforderungen in der Art von Man in the Middle Attack. Durch die Installation des von mitmproxy generierten Zertifikats auf dem Terminal kann die HTTPS-Kommunikation auf dieselbe Weise behandelt werden.

Einzelheiten zur Installation von Mitmproxy usw. finden Sie in den folgenden Artikeln.

Was ich diesmal machen möchte

Anfragen können von mitmproxy durch Schreiben eines Python-Skripts manipuliert werden. Dieses Mal werden wir das Verfahren unter der Annahme der folgenden Fälle erklären.

Möglicherweise kann das Problem gelöst werden, indem der Aufbau und die Verteilung für die Entwicklungsumgebung aus dem Funktionszweig heraus automatisiert werden. Es kann jedoch vorkommen, dass eine solche Umgebung nicht bereit ist. Selbst wenn es eine solche Umgebung gibt und Sie beim mehrmaligen Wechseln zwischen mehreren Umgebungen überprüfen möchten, ist es möglicherweise einfacher, die Anforderung zu manipulieren, als mehrere Apps neu zu starten. ..

Verfahren

Installieren Sie mitmproxy

Weitere Informationen finden Sie unter Abfangen oder Manipulieren der SSL-Kommunikation des tatsächlichen iOS-Geräts durch einen Proxy.

Vorbereiten eines Python-Programms für die Manipulation von Anforderungen

Dieses Mal möchte ich "Ich möchte das Anforderungsziel der in der Anwendung erstellten Web-API in die Entwicklungsumgebung ändern". In diesem Fall müssen Sie zwei Dinge tun:

  1. Manipulieren Sie den Hostnamen für die TCP / IP-Anforderung
  2. Manipulieren Sie den Host im HTTP-Anforderungsheader

Das folgende Python-Programm führt dies aus. Ändern Sie den Hostnamen usw. nach Bedarf.

replace_host.py


def request(context, flow):
    #Ursprünglicher Hostname(Produktionsumfeld)
    original = "example.com"
    #Hostname nach dem Austausch(Entwicklungsumgebung)
    replace  = "dev.example.com"

    if original in flow.request.host:
        if original in flow.request.headers["Host"]:
            #Namen des Zielhosts anfordern
            flow.request.host = replace
            #Host im HTTP-Anforderungsheader
            flow.request.headers["Host"] = [replace]

Der Anforderungsheader kann auf andere Weise als Host manipuliert werden. Es ist wichtig zu beachten, dass flow.request.headers den Headernamen als Schlüssel verwendet und der Wert ein * String-Array * enthält. Im HTTP-Header können mehrere Werte mit demselben Schlüssel festgelegt werden. (Set-Cookie etc.)

Starten Sie Mitmproxy

Starten Sie beim Laden des vorbereiteten Python-Skripts.

$ mitmproxy -p 8080 -s replace_host.py

Jetzt müssen Sie nur noch Ihre App mit diesem Proxy debuggen.

Bonus: Manipulieren Sie Anfragen nur auf bestimmten Pfaden

Im vorherigen Programm wurden Manipulationen unter der Bedingung durchgeführt, dass "nur Anforderungen an einen bestimmten Host gestellt werden". Wenn Sie außerdem die Bedingung "in einem bestimmten Pfad" hinzufügen, ist dies wie folgt.

replace_host.py


def request(context, flow):
    #Ursprünglicher Hostname(Produktionsumfeld)
    original = "example.com"
    #Hostname nach dem Austausch(Entwicklungsumgebung)
    replace  = "dev.example.com"
    #Pfad zum Manipulieren
    target_path = '/api/foo'

    if original in flow.request.host:
        if original in flow.request.headers["Host"]:
            #Nur in einem bestimmten Pfad
            if flow.request.path == target_path:
                #Namen des Zielhosts anfordern
                flow.request.host = replace
                #Host im HTTP-Anforderungsheader
                flow.request.headers["Host"] = [replace]

Dies kann erreicht werden, indem der Wert von "flow.request.path" überprüft wird. Hier wird die genaue Übereinstimmung mit == überprüft, aber verschiedene Anwendungen, z. B. das Targeting aller Elemente in einem bestimmten Verzeichnis mit einem regulären Ausdruck, sind möglich.

Ich dachte, es wäre praktisch, wenn die offizielle Dokumentation von Mitmproxy eine Sammlung von Rezepten hier hätte.

Recommended Posts

Verwenden Sie Mitmproxy, um die API Ihrer App in eine Entwicklungsumgebung zu zwingen
Verwendung von Docker zum Containerisieren Ihrer Anwendung und Verwenden von Docker Compose zum Ausführen Ihrer Anwendung in einer Entwicklungsumgebung
So gelangen Sie mit Vagrant in die Python-Entwicklungsumgebung
So verwenden Sie das Jupyter-Notebook, ohne Ihre Umgebung mit Docker zu verschmutzen
Bereiten Sie Ihre erste Python-Entwicklungsumgebung vor
Verwendung der Python-API von OpenPose
Wie benutzt man Bing Search API?
[Python] Verwendung der Typetalk-API
Fügen Sie mitmproxy Ihre eigene Inhaltsansicht hinzu
Verwendung von Tensorflow unter Docker-Umgebung
Verwendung der Cloud Vision API von GCP
Flutter in Docker - Erstellen und Verwenden einer Flutter-Entwicklungsumgebung in einem Docker-Container