Body-Umschreibung

Chute kann Inhalte in HTTP-Anfrage- und Antwort-Bodys mithilfe von regulären Ausdrücken oder JSONPath-Ausdrücken suchen und ersetzen. Dies erfordert MitM-Entschlüsselung für HTTPS-Verkehr.

Hinweis: Eine unverschlüsselte HTTP-Anfrage wird nur verarbeitet, wenn sie Chute über seinen HTTP-Proxy erreicht; unverschlüsseltes HTTP, das über die TUN-Schnittstelle ankommt, wird unverändert weitergeleitet. Chute Android leitet sämtlichen Verkehr über TUN, sofern nicht System-HTTP-Proxy in den Einstellungen eingeschaltet ist, womit Apps den HTTP-Proxy von Chute erhalten (Android 10 und neuer; standardmäßig aus).

Die Surge-jq-Programme http-request-jq und http-response-jq werden ebenfalls unterstützt — siehe Surge-Syntax.

Body-Umschreibungsregeln werden im Abschnitt [Body Rewrite] definiert. Pro Richtung (Anfrage / Antwort) wird nur die erste übereinstimmende Regel auf eine Nachricht angewendet. Passt auf dieselbe Nachricht auch ein http-request- oder http-response-Skript, das den Body erhält, wird zuerst die Regel angewendet, und das Skript sieht den umgeschriebenen Body; ein http-request-before-send-Skript läuft nach beiden.

[Body Rewrite]
^https://api\.example\.com/response.* response regex "old-text" "new-text"
^https://api\.example\.com/request.* request regex "sensitive" "[redacted]"
^https://api\.example\.com/data.* jsonpath-response jsonpath $.ads null

Regelformat

Jede Regel folgt diesem allgemeinen Format:

<URL regex> [direction] <mode> <pattern> <replacement>

Hinweis: Der reguläre Ausdruck für die URL wird an beliebiger Stelle der vollständigen Anfrage-URL abgeglichen, und ebenso in ihrem Pfad allein, wie bei der URL-Umschreibung: ^https://example\.com deckt bereits jeden Pfad und Query-String dieses Hosts ab, ein abschließendes .* ist unnötig, und ^/api passt auf jede Anfrage, deren Pfad mit /api beginnt. Die vollständige URL einer entschlüsselten Anfrage beginnt mit https://, daher passt ein Muster ^http:// nie auf eine solche Anfrage. Das Muster behält seine Groß-/Kleinschreibung, sodass \S, \D, \W und \B bedeuten, was dasteht; der Abgleich selbst ignoriert die Groß-/Kleinschreibung.

Ein # oder // am Zeilenanfang oder nach einem Leerzeichen leitet einen Kommentar ein, der bis zum Zeilenende reicht, sofern es nicht in doppelten Anführungszeichen steht; ; tut das nie. Siehe Kommentar.

Surge-Syntax

Auch Surges eigene Zeilenform wird akzeptiert: Die Richtung steht vorn, und das Schlüsselwort regex entfällt.

[Body Rewrite]
http-response ^https://api\.example\.com/feed "\"ads\":\s*\[.*?\]" "\"ads\":[]"
http-request ^https://api\.example\.com/submit "sensitive" "[redacted]"

Eine Surge-Zeile kann mehrere Paare aus Muster und Ersetzung tragen; sie werden von links nach rechts angewendet, jedes auf das Ergebnis des vorherigen. http-request-jq und http-response-jq nehmen statt Muster und Ersetzung ein jq-Programm entgegen: <Typ> <URL-Muster> <jq-Programm>; das Programm wird meist in Anführungszeichen gesetzt, da es Leerzeichen enthält. Außerhalb der Anführungszeichen beginnt ein // oder #, das auf ein Leerzeichen folgt, einen Kommentar, der das Programm dort beendet; innerhalb der Anführungszeichen ist // der Alternativoperator von jq, setzen Sie ein Programm, das ihn verwendet, also in Anführungszeichen. Es läuft über den Body als JSON. Ein Body, der kein JSON ist, ein Programm, das einen Fehler wirft, und ein Programm ohne Ausgabe lassen den Body jeweils unverändert; ein ungültiges Programm wird gemeldet und nur diese eine Regel übersprungen, ohne das restliche Profil scheitern zu lassen. Ein Programm kann weder Dateien noch die Umgebung lesen: import und include lösen nichts auf, und $ENV sowie env sind leer.

Hinweis: Chute Android führt jq-Programme mit jackson-jq aus. Dessen Ausgabe ist auf 4096 Ergebnisse oder 4 MB begrenzt — ein Programm, das mehr erzeugt, lässt den Body unverändert —, und es fehlen einige eingebaute Funktionen von jq 1.7, darunter die Datumsfunktionen außer now, todateiso8601 und fromdateiso8601 (strftime, strptime, mktime, gmtime, todate und dergleichen), @base32 und @base32d, abs, toarray, trim, ltrim und rtrim, IN, INDEX und JOIN, tostream und fromstream. Ein Programm, das eine davon aufruft, wirft beim Ausführen einen Fehler, was den Body unverändert lässt.

Richtung

Schlüsselwort Beschreibung
response Auf Antwort-Body anwenden (Standard, wenn ausgelassen)
request Auf Anfrage-Body anwenden

Modi

Modus Beschreibung
regex Suchen und Ersetzen per regulärem Ausdruck
jsonpath-response / jsonpath-request / body-jsonpath-response / body-jsonpath-request JSONPath-basierte Änderung

Regex-Modus

Führt standardmäßiges Regex-Suchen-und-Ersetzen auf dem dekodierten Body-Text durch. Verwendet NSRegularExpression (ICU) mit Groß-/Kleinschreibung ignorierendem Abgleich. Die Ersetzung unterstützt Capture-Gruppen-Referenzen ($1, $2 usw.).

<URL regex> [response|request] regex <pattern> <replacement>

Beispiel — Werbung aus JSON-Antwort entfernen:

[Body Rewrite]
^https://api\.example\.com/feed.* response regex "\"ads\":\s*\[.*?\]" "\"ads\":[]"

Beispiel — Anfrage-Body bereinigen:

[Body Rewrite]
^https://api\.example\.com/submit.* request regex "\"password\":\s*\".*?\"" "\"password\":\"[FILTERED]\""

Beispiel — Capture Groups zur Neuformatierung von Daten verwenden:

[Body Rewrite]
// "Nachname, Vorname" zu "Vorname Nachname" tauschen
^https://api\.example\.com/users.* response regex "\"name\":\s*\"(\w+),\s*(\w+)\"" "\"name\":\"$2 $1\""

Beispiel — Eingebettete URLs im Antwort-Body umschreiben:

[Body Rewrite]
^https://api\.example\.com.* response regex "https://old-cdn\.example\.com" "https://new-cdn.example.com"

Token, die Leerzeichen enthalten, müssen mit doppelten Anführungszeichen umschlossen werden:

[Body Rewrite]
^https://example\.com.* response regex "old value with spaces" "new value"

Um ein literales doppeltes Anführungszeichen innerhalb eines umschlossenen Tokens einzufügen, maskieren Sie es mit Backslash: \".


JSONPath-Modus

Ändert JSON-Bodys mithilfe von JSONPath-Ausdrücken. Unterstützt Lesen, Setzen und Löschen von Werten an bestimmten Pfaden.

<URL regex> jsonpath-response|jsonpath-request jsonpath <jsonpath-expression> [value]

Unterstützte JSONPath-Syntax

Ausdruck Beschreibung
$.key Auf Objekteigenschaft zugreifen
$.key.subkey Auf verschachtelte Eigenschaften zugreifen
$[0] Auf Array-Element per Index zugreifen
$.key[0].subkey Gemischter Objekt- und Array-Zugriff
$.items[*].name Wildcard: alle Elemente im Array
$.*.value Wildcard: alle Eigenschaften

.* erfasst jede Eigenschaft eines Objekts und jedes Element eines Arrays, sodass $.items.*.name den Namen jedes Eintrags erreicht. Als letzter Schritt auf einem Array ändert es nichts; um die Elemente selbst zu ersetzen, verwenden Sie [*].

Werttypen

Wert Ergebnis
string Auf Zeichenfolge setzen — alles, was keine der folgenden Formen hat; example.com, 1.0.0-beta und 12abc bleiben also Zeichenfolgen
42 Auf Ganzzahl setzen — ein Token, das vollständig eine JSON-Zahl ist, ohne Nachkommastellen und Exponent
3.14 Auf Gleitkommazahl setzen — eine JSON-Zahl mit Nachkommastellen oder Exponent, etwa 1e3, oder eine Ganzzahl, die nicht in 64 Bit passt
true Auf booleschen Wert true setzen
false Auf booleschen Wert false setzen
[…] oder {…} Ohne Anführungszeichen als JSON geparst und als dieses Array bzw. Objekt gesetzt; es ist das letzte Feld, der Rest der Zeile wird also wörtlich genommen und darf Leerzeichen enthalten. Mit Anführungszeichen oder wenn es kein gültiges JSON ist, bleibt es eine Zeichenfolge.
null, nil oder ausgelassen Den Pfad löschen

Hinweis: Das Umschließen eines Werts mit Anführungszeichen erzwingt keinen String-Typ — Anführungszeichen werden bei der Tokenisierung entfernt und der Typ wird aus dem verbleibenden Inhalt abgeleitet, sodass "42" zur Zahl 42 und "true" zum booleschen Wert true wird und "null" den Pfad löscht; die Anführungszeichen machen nur bei […] und {…} einen Unterschied, die in Anführungszeichen Zeichenfolgen bleiben. Die Schlüsselwörter müssen genau so geschrieben sein, auch in der Groß- und Kleinschreibung, True und NULL sind also Zeichenfolgen. Eine Zahl gilt nur, wenn das ganze Token eine ist, so geschrieben, wie JSON Zahlen schreibt: +1, .5, 1. und 007 bleiben Zeichenfolgen, ebenso eine Zahl, die selbst für eine Gleitkommazahl zu groß ist, etwa 1e400. Es gibt keine Schreibweise, die eine Zeichenfolge wie "42" oder "true" setzt — nehmen Sie dafür eine regex-Regel.

Beispiel — Ein JSON-Feld setzen:

[Body Rewrite]
^https://api\.example\.com/profile.* jsonpath-response jsonpath $.user.name "Anonymous"

Beispiel — Ein JSON-Feld löschen:

[Body Rewrite]
^https://api\.example\.com/data.* jsonpath-response jsonpath $.tracking null

Beispiel — Wildcard-Änderung:

[Body Rewrite]
^https://api\.example\.com/list.* jsonpath-response jsonpath $.items[*].hidden true

Praxisbeispiele

Tracking-Parameter aus JSON-Antworten entfernen

Entfernen Sie das trackingId-Feld aus allen API-Antworten. Da pro Richtung nur die erste übereinstimmende Regel angewendet wird, verwenden Sie eine Regel pro URL-Muster:

[Body Rewrite]
^https://api\.example\.com/.* jsonpath-response jsonpath $.trackingId null

Ein Script-Tag in HTML-Antworten einfügen

Ein benutzerdefiniertes <script>-Tag vor </body> in allen HTML-Seiten anhängen:

[Body Rewrite]
^https://www\.example\.com/.* response regex "</body>" "<script>console.log('injected')</script></body>"

Vertrauliche Felder in Anfrageprotokollen schwärzen

API-Schlüssel und Token in ausgehenden Anfrage-Bodys ersetzen, bevor sie den Server erreichen. Da pro Richtung nur die erste übereinstimmende Regel angewendet wird, kombinieren Sie beide Felder in einer einzigen Regel:

[Body Rewrite]
^https://api\.example\.com/.* request regex "\"(apiKey|token)\":\s*\"[^\"]+\"" "\"$1\":\"[REDACTED]\""

Datumsformate in Antworten normalisieren

ISO-Daten durch ein kürzeres Format ersetzen:

[Body Rewrite]
^https://api\.example\.com/.* response regex "(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})Z" "$1/$2/$3 $4:$5"

Feature-Flags in der App-Konfiguration deaktivieren

Alle Feature-Flags in einem Konfigurationsendpunkt auf false zwingen:

[Body Rewrite]
^https://api\.example\.com/config.* jsonpath-response jsonpath $.features[*].enabled false

CDN-URLs in zwischengespeicherten Antworten umschreiben

Alle Verweise auf ein altes CDN durch ein neues ersetzen:

[Body Rewrite]
^https://www\.example\.com/.* response regex "https://old-cdn\.example\.com" "https://new-cdn.example.com"

Verarbeitungspipeline

Die Body-Umschreibung behandelt automatisch:

  1. Content-Encoding: Unterstützt gzip und deflate. Überspringt nicht unterstützte Kodierungen.
  2. Transfer-Encoding: Löst die Chunked-Transfer-Kodierung vor der Verarbeitung auf.
  3. Dekodierung: Dekomprimiert Bodys vor der Anwendung von Umschreibungsregeln.
  4. Neukodierung: Komprimiert Bodys neu und aktualisiert Content-Length. Entfernt den Transfer-Encoding-Header.
  5. Accept-Encoding: Wenn eine Antwort-Regel auf die URL einer Anfrage passt, wird der Accept-Encoding-Header der Anfrage auf gzip, deflate, identity umgeschrieben, damit die Antwort in einer dekodierbaren Kodierung bleibt.

Die maximale Body-Größe für die Umschreibungsverarbeitung beträgt bei HTTP/1.x (unverschlüsseltes HTTP und entschlüsseltes HTTP/1.1) 128 KB; größere Bodys werden ohne Änderung durchgeleitet. Eine entschlüsselte HTTP/2-Nachricht wird vollständig gepuffert und unabhängig von ihrer Größe umgeschrieben.

Bei HTTP/1.x wird ein Antwort-Body erst umgeschrieben, wenn er vollständig angekommen ist. Schließt der Server die Verbindung vorher, ist ein Body ohne Content-Length und ohne Chunked-Kodierung vollständig — das Schließen ist sein Ende — und wird wie gewohnt umgeschrieben. Ein Body mit Content-Length oder Chunked-Kodierung, den das Schließen abgeschnitten hat, geht genau so an den Client, wie er ankam, nicht umgeschrieben und mit unverändertem Content-Length, und danach wird die Verbindung geschlossen, sodass der Client erkennen kann, dass die Antwort unvollständig ist.


Hinweise

  • Für HTTPS-Verkehr muss die MitM-Entschlüsselung für den übereinstimmenden Hostnamen aktiviert sein.
  • Der Regex-Abgleich ignoriert Groß-/Kleinschreibung. Die Ersetzungsvorlage unterstützt ICU-Capture-Gruppen-Referenzen: $0 (vollständige Übereinstimmung), $1 (erste Gruppe), $2 (zweite Gruppe) usw.
  • Ein URL-Muster oder ein Body-Muster, das kein gültiger regulärer Ausdruck ist, macht eine Regex- oder JSONPath-Zeile zu einem Konfigurationsfehler, und die Regel wird nicht geladen; eine jq-Zeile wird stattdessen mit einer Warnung übersprungen. In den Paaren nach dem ersten verwirft ein ungültiges Muster nur dieses Paar, mit einer Warnung im Protokoll.
  • Der JSONPath-Modus wird nur angewendet, wenn der Body gültiges JSON ist.
  • Body-Umschreibungsregeln werden auf den dekodierten (UTF-8) Body-Text angewendet.
  • Pro Richtung (Anfrage / Antwort) wird nur die erste übereinstimmende Regel auf eine Nachricht angewendet. Definieren Sie eine kombinierte Regel, wenn Sie mehrere Änderungen benötigen.
  • Das Löschen eines nicht vorhandenen JSONPath lässt den Body unverändert. Das Setzen eines Werts erzeugt den Schlüssel, wenn dessen übergeordnetes Objekt existiert; fehlt ein Zwischenpfad, passiert nichts.
S. Smart Rabbit LLC © All Rights Reserved            updated 2026-09-29 21:57:05

Diese Seite ist eine Übersetzung der englischen Version. Bei Abweichungen ist die englische Version maßgeblich.

results matching ""

    No results matching ""