ボディリライト
Chuteは正規表現またはJSONPath式を使用して、HTTPリクエストおよびレスポンスボディのコンテンツを検索・置換できます。HTTPSトラフィックにはMitM復号が必要です。
ボディリライトルールは[Body Rewrite]セクションで定義されます。1つのリクエストに複数のルールを適用できます。
[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
ルール形式
各ルールは次の一般的な形式に従います:
<URL regex> [direction] <mode> <pattern> <replacement>
方向
| キーワード | 説明 |
|---|---|
response |
レスポンスボディに適用(省略時のデフォルト) |
request |
リクエストボディに適用 |
モード
| モード | 説明 |
|---|---|
regex |
正規表現による検索と置換 |
jsonpath-response / jsonpath-request / body-jsonpath-response / body-jsonpath-request |
JSONPathベースの変更 |
正規表現モード
デコードされたボディテキストに対して標準的な正規表現の検索と置換を実行します。NSRegularExpression(ICU)を使用し、大文字小文字を区別しないマッチングを行います。置換はキャプチャグループ参照($1、$2など)をサポートします。
<URL regex> [response|request] regex <pattern> <replacement>
例 — JSONレスポンスから広告を削除:
[Body Rewrite]
^https://api\.example\.com/feed response regex "\"ads\":\s*\[.*?\]" "\"ads\":[]"
例 — リクエストボディをサニタイズ:
[Body Rewrite]
^https://api\.example\.com/submit request regex "\"password\":\s*\".*?\"" "\"password\":\"[FILTERED]\""
例 — キャプチャグループを使用してデータを再フォーマット:
[Body Rewrite]
// "last, first" を "first last" に入れ替え
^https://api\.example\.com/users response regex "\"name\":\s*\"(\\w+),\\s*(\\w+)\"" "\"name\":\"$2 $1\""
例 — レスポンスボディ内の埋め込みURLをリライト:
[Body Rewrite]
^https://api\.example\.com response regex "https://old-cdn\\.example\\.com" "https://new-cdn.example.com"
スペースを含むトークンはダブルクォートで囲む必要があります:
[Body Rewrite]
^https://example\.com response regex "old value with spaces" "new value"
トークン内にリテラルのダブルクォートを含めるには、バックスラッシュでエスケープします: \"。
JSONPathモード
JSONPath式を使用してJSONボディを変更します。特定のパスでの値の読み取り、設定、削除をサポートします。
<URL regex> jsonpath-response|jsonpath-request jsonpath <jsonpath-expression> [value]
サポートされるJSONPath構文
| 式 | 説明 |
|---|---|
$.key |
オブジェクトプロパティにアクセス |
$.key.subkey |
ネストされたプロパティにアクセス |
$[0] |
インデックスで配列要素にアクセス |
$.key[0].subkey |
オブジェクトと配列の混合アクセス |
$.items[*].name |
ワイルドカード: 配列内の全アイテム |
$.*.value |
ワイルドカード: 全プロパティ |
値の型
| 値 | 結果 |
|---|---|
"string" |
文字列値に設定 |
42 |
整数に設定 |
3.14 |
浮動小数点数に設定 |
true |
ブール値trueに設定 |
false |
ブール値falseに設定 |
null または省略 |
パスを削除 |
例 — JSONフィールドを設定:
[Body Rewrite]
^https://api\.example\.com/profile jsonpath-response jsonpath $.user.name "Anonymous"
例 — JSONフィールドを削除:
[Body Rewrite]
^https://api\.example\.com/data jsonpath-response jsonpath $.tracking null
例 — ワイルドカード変更:
[Body Rewrite]
^https://api\.example\.com/list jsonpath-response jsonpath $.items[*].hidden true
実践例
JSONレスポンスからトラッキングパラメータを除去
全てのAPIレスポンスからtrackingIdとsessionIdフィールドを削除:
[Body Rewrite]
^https://api\.example\.com/ jsonpath-response jsonpath $.trackingId null
^https://api\.example\.com/ jsonpath-response jsonpath $.sessionId null
HTMLレスポンスにスクリプトタグを注入
全てのHTMLページの</body>の前にカスタム<script>タグを追加:
[Body Rewrite]
^https://www\.example\.com/ response regex "</body>" "<script>console.log('injected')</script></body>"
リクエストログの機密フィールドを墨消し
サーバーに到達する前に、送信リクエストボディ内のAPIキーとトークンを置換:
[Body Rewrite]
^https://api\.example\.com/ request regex "\"apiKey\":\s*\"[^\"]+\"" "\"apiKey\":\"[REDACTED]\""
^https://api\.example\.com/ request regex "\"token\":\s*\"[^\"]+\"" "\"token\":\"[REDACTED]\""
レスポンスの日付形式を正規化
ISO日付を短い形式に置換:
[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"
アプリ設定の機能フラグを無効化
設定エンドポイントの全ての機能フラグをfalseに強制:
[Body Rewrite]
^https://api\.example\.com/config jsonpath-response jsonpath $.features[*].enabled false
キャッシュされたレスポンスのCDN URLをリライト
古いCDNへの全ての参照を新しいものに置換:
[Body Rewrite]
^https://www\.example\.com/ response regex "https://old-cdn\.example\.com" "https://new-cdn.example.com"
処理パイプライン
ボディリライトは以下を自動的に処理します:
- Content-Encoding:
gzipとdeflateをサポート。サポートされていないエンコーディングはスキップされます。 - Transfer-Encoding: 処理前にチャンク転送エンコーディングをデチャンクします。
- デコード: リライトルールを適用する前にボディを展開します。
- 再エンコード: ボディを再圧縮し、
Content-Lengthを更新します。Transfer-Encodingヘッダーを削除します。
リライト処理の最大ボディサイズはデフォルトで128KBです。これより大きいボディは変更されずに通過します。
注意事項
- HTTPSトラフィックの場合、マッチするホスト名に対してMitM復号が有効になっている必要があります。
- 正規表現マッチングは大文字小文字を区別しません。置換テンプレートはICUキャプチャグループ参照をサポートします:
$0(完全一致)、$1(最初のグループ)、$2(2番目のグループ)など。 - JSONPathモードはボディが有効なJSONである場合にのみ適用されます。
- ボディリライトルールはデコードされた(UTF-8)ボディテキストに適用されます。
- 同じリクエスト/レスポンスに複数のルールがマッチして適用される可能性があります(定義された順序で適用されます)。
- ルールが存在しないパスの値をJSONPathで設定または削除した場合、ボディは変更されません。