Body Rewrite
Chute สามารถค้นหาและแทนที่เนื้อหาในเนื้อหาคำขอและการตอบกลับ HTTP โดยใช้นิพจน์ปกติหรือ JSONPath expressions สิ่งนี้ต้องการการถอดรหัส MitM สำหรับทราฟฟิก HTTPS
กฎ Body Rewrite ถูกกำหนดในส่วน [Body Rewrite] สำหรับแต่ละทิศทาง (คำขอ / การตอบกลับ) จะมีเพียงกฎแรกที่ตรงกันเท่านั้นที่ถูกใช้กับข้อความหนึ่งๆ
[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>
หมายเหตุ: นิพจน์ปกติของ URL ต้องจับคู่กับ URL ของคำขอแบบสมบูรณ์ ไม่ใช่แค่ส่วนย่อยของมัน โดยปกติรูปแบบควรลงท้ายด้วย
.*เพื่อให้จับคู่ URL ที่มี path และ query string ใดๆ ได้
ทิศทาง
| คำสำคัญ | คำอธิบาย |
|---|---|
response |
ใช้กับเนื้อหาการตอบกลับ (ค่าเริ่มต้นหากละไว้) |
request |
ใช้กับเนื้อหาคำขอ |
โหมด
| โหมด | คำอธิบาย |
|---|---|
regex |
ค้นหาและแทนที่ด้วยนิพจน์ปกติ |
jsonpath-response / jsonpath-request / body-jsonpath-response / body-jsonpath-request |
การแก้ไขตาม JSONPath |
โหมด Regex
ดำเนินการค้นหาและแทนที่ด้วย regex มาตรฐานบนข้อความเนื้อหาที่ถอดรหัส ใช้ 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
แก้ไขเนื้อหา JSON โดยใช้ JSONPath expressions รองรับการอ่าน ตั้งค่า และลบค่าที่เส้นทางเฉพาะ
<URL regex> jsonpath-response|jsonpath-request jsonpath <jsonpath-expression> [value]
ไวยากรณ์ JSONPath ที่รองรับ
| Expression | คำอธิบาย |
|---|---|
$.key |
เข้าถึงคุณสมบัติของวัตถุ |
$.key.subkey |
เข้าถึงคุณสมบัติซ้อน |
$[0] |
เข้าถึงองค์ประกอบอาร์เรย์ตามดัชนี |
$.key[0].subkey |
การเข้าถึงแบบผสมระหว่างวัตถุและอาร์เรย์ |
$.items[*].name |
Wildcard: รายการทั้งหมดในอาร์เรย์ |
$.*.value |
Wildcard: คุณสมบัติทั้งหมด |
ประเภทค่า
| ค่า | ผลลัพธ์ |
|---|---|
"string" |
ตั้งค่าเป็นสตริง |
42 |
ตั้งค่าเป็นจำนวนเต็ม |
3.14 |
ตั้งค่าเป็นทศนิยม |
true |
ตั้งค่าเป็นบูลีน true |
false |
ตั้งค่าเป็นบูลีน false |
null หรือละไว้ |
ลบเส้นทาง |
หมายเหตุ: การครอบค่าด้วยเครื่องหมายอัญประกาศไม่ได้บังคับให้เป็นประเภทสตริง — เครื่องหมายอัญประกาศจะถูกตัดออกระหว่างการแยกโทเค็น และประเภทจะถูกอนุมานจากเนื้อหาที่เหลือ ดังนั้น
"42"จะกลายเป็นตัวเลข 42 และ"true"จะกลายเป็นบูลีน true คำสำคัญnilก็ได้รับการยอมรับเป็นคำสำคัญสำหรับการลบเช่นเดียวกับ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
ตัวอย่าง — การแก้ไขด้วย wildcard:
[Body Rewrite]
^https://api\.example\.com/list.* jsonpath-response jsonpath $.items[*].hidden true
ตัวอย่างการใช้งานจริง
ลบพารามิเตอร์ติดตามจากการตอบกลับ JSON
ลบฟิลด์ trackingId จากการตอบกลับ API ทั้งหมด เนื่องจากมีเพียงกฎแรกที่ตรงกันต่อทิศทางเท่านั้นที่ถูกใช้ ให้ใช้หนึ่งกฎต่อหนึ่งรูปแบบ URL:
[Body Rewrite]
^https://api\.example\.com/.* jsonpath-response jsonpath $.trackingId null
แทรกแท็กสคริปต์ในการตอบกลับ HTML
เพิ่มแท็ก <script> ที่กำหนดเองก่อน </body> ในหน้า HTML ทั้งหมด:
[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|token)\":\s*\"[^\"]+\"" "\"$1\":\"[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
เขียน URL CDN ใหม่ในการตอบกลับที่แคช
แทนที่การอ้างอิงทั้งหมดไปยัง CDN เก่าด้วย CDN ใหม่:
[Body Rewrite]
^https://www\.example\.com/.* response regex "https://old-cdn\.example\.com" "https://new-cdn.example.com"
ไปป์ไลน์การประมวลผล
Body Rewrite จัดการโดยอัตโนมัติ:
- Content-Encoding: รองรับ
gzipและdeflateข้ามการเข้ารหัสที่ไม่รองรับ - Transfer-Encoding: ถอด chunked transfer encoding ก่อนการประมวลผล
- การถอดรหัส: คลายการบีบอัดเนื้อหาก่อนใช้กฎการเขียนใหม่
- การเข้ารหัสใหม่: บีบอัดเนื้อหาใหม่และอัปเดต
Content-Lengthลบส่วนหัวTransfer-Encoding - Accept-Encoding: เมื่อกฎการตอบกลับจับคู่กับ URL ของคำขอ ส่วนหัว
Accept-Encodingของคำขอจะถูกเขียนใหม่เป็นgzip, deflate, identityเพื่อให้การตอบกลับยังคงอยู่ในการเข้ารหัสที่ถอดรหัสได้
ขนาดเนื้อหาสูงสุดสำหรับการประมวลผลการเขียนใหม่คือ 128KB เนื้อหาที่ใหญ่กว่านี้จะถูกส่งต่อโดยไม่มีการแก้ไข
หมายเหตุ
- สำหรับทราฟฟิก HTTPS ต้องเปิดใช้งานการถอดรหัส MitM สำหรับชื่อโฮสต์ที่ตรงกัน
- การจับคู่ regex เป็นแบบไม่คำนึงถึงตัวพิมพ์เล็กใหญ่ เทมเพลตการแทนที่รองรับการอ้างอิงกลุ่มจับคู่ ICU:
$0(การจับคู่เต็ม),$1(กลุ่มแรก),$2(กลุ่มที่สอง) ฯลฯ - โหมด JSONPath ใช้ได้เฉพาะเมื่อเนื้อหาเป็น JSON ที่ถูกต้อง
- กฎ Body Rewrite ถูกใช้กับเนื้อหาข้อความที่ถอดรหัส (UTF-8)
- จะมีเพียงกฎแรกที่ตรงกันต่อทิศทาง (คำขอ / การตอบกลับ) เท่านั้นที่ถูกใช้กับข้อความหนึ่งๆ กำหนดกฎรวมเพียงกฎเดียวหากคุณต้องการแก้ไขหลายจุด
- การลบ JSONPath ที่ไม่มีอยู่จะทำให้เนื้อหาไม่เปลี่ยนแปลง การตั้งค่าจะสร้างคีย์เมื่อออบเจ็กต์แม่ของมันมีอยู่ หากเส้นทางระหว่างกลางหายไป จะไม่มีอะไรเกิดขึ้น
หน้านี้เป็นฉบับแปลจากเวอร์ชันภาษาอังกฤษ หากเนื้อหาไม่ตรงกัน ให้ยึดเวอร์ชันภาษาอังกฤษเป็นหลัก