إعادة كتابة المحتوى
يستطيع Chute البحث والاستبدال في محتوى طلبات واستجابات HTTP باستخدام تعبيرات نمطية أو تعبيرات JSONPath. هذا يتطلب فك تشفير MitM لحركة HTTPS.
تُعرف قواعد إعادة كتابة المحتوى في القسم [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>
الاتجاه
| الكلمة المفتاحية | الوصف |
|---|---|
response |
تطبيق على محتوى الاستجابة (الافتراضي إذا تم حذفه) |
request |
تطبيق على محتوى الطلب |
الأنماط
| النمط | الوصف |
|---|---|
regex |
بحث واستبدال بتعبير نمطي |
jsonpath-response / jsonpath-request / body-jsonpath-response / body-jsonpath-request |
تعديل قائم على JSONPath |
نمط 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\""
مثال — إعادة كتابة الروابط المضمنة في محتوى الاستجابة:
[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. يدعم قراءة، تعيين، وحذف القيم في مسارات محددة.
<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
أمثلة عملية
Strip Tracking Parameters from JSON Responses
إزالة حقلي trackingId و sessionId من جميع استجابات API:
[Body Rewrite]
^https://api\.example\.com/ jsonpath-response jsonpath $.trackingId null
^https://api\.example\.com/ jsonpath-response jsonpath $.sessionId null
Inject a script tag into HTML responses
إلحاق وسم <script> مخصص قبل </body> في جميع صفحات HTML:
[Body Rewrite]
^https://www\.example\.com/ response regex "</body>" "<script>console.log('injected')</script></body>"
Redact sensitive fields in request logs
استبدال مفاتيح API والرموز في محتويات الطلبات الصادرة قبل وصولها إلى الخادم:
[Body Rewrite]
^https://api\.example\.com/ request regex "\"apiKey\":\s*\"[^\"]+\"" "\"apiKey\":\"[REDACTED]\""
^https://api\.example\.com/ request regex "\"token\":\s*\"[^\"]+\"" "\"token\":\"[REDACTED]\""
Normalize date formats in responses
استبدال تواريخ 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"
Disable feature flags in app config
فرض جميع أعلام الميزات إلى false في نقطة نهاية إعدادات:
[Body Rewrite]
^https://api\.example\.com/config jsonpath-response jsonpath $.features[*].enabled false
Rewrite CDN URLs in cached responses
استبدال جميع الإشارات إلى 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: يفك ترميز chunked transfer encoding قبل المعالجة.
- فك الترميز: يفك ضغط المحتويات قبل تطبيق قواعد إعادة الكتابة.
- إعادة الترميز: يعيد ضغط المحتويات ويحدث
Content-Length. يزيل ترويسةTransfer-Encoding.
الحد الأقصى لحجم المحتوى لمعالجة إعادة الكتابة هو 128KB افتراضياً. المحتويات الأكبر من هذا تمر دون تعديل.
ملاحظات
- لحركة HTTPS، يجب تفعيل فك تشفير MitM لاسم المضيف المطابق.
- مطابقة Regex غير حساسة لحالة الأحرف. قالب الاستبدال يدعم مراجع مجموعات الالتقاط ICU:
$0(المطابقة الكاملة)،$1(المجموعة الأولى)،$2(المجموعة الثانية)، إلخ. - نمط JSONPath يطبق فقط إذا كان المحتوى JSON صالحاً.
- قواعد إعادة كتابة المحتوى تطبق على نص المحتوى المفكوك (UTF-8).
- يمكن لعدة قواعد المطابقة والتطبيق على نفس الطلب/الاستجابة (تطبق بالترتيب الذي تعرف به).
- عندما تعين قاعدة أو تحذف قيمة عبر JSONPath غير موجودة، يترك المحتوى دون تغيير.