العودة إلى المدونة

ميتيمبروكسي للمطورين: اعتراض وتحليل حركة HTTPS مع أمثلة كود بلغة بايثون

mitmproxy هو أداة قوية لاعتراض وتحليل حركة مرور HTTPS. نتناول تثبيت وإعداد شهادات SSL، كتابة السكريبتات، وسيناريوهات الاستخدام الفعلية.

📅٢٢ صفر ١٤٤٨ هـ
```html

هل تقوم بتصحيح تطبيق موبايل ولا تفهم أي الطلبات يرسلها إلى الخادم؟ هل تحتاج إلى اختبار سلوك واجهة برمجة التطبيقات في ظروف مختلفة أو اعتراض الاستجابة وتغيير البيانات في الوقت الفعلي؟ يحل mitmproxy جميع هذه المهام — إنه أداة مجانية ومفتوحة المصدر تتيح لك التحكم الكامل في حركة مرور HTTP وHTTPS بين العميل والخادم.

ما هو mitmproxy ولماذا يحتاجه المطور

mitmproxy هو وكيل MITM تفاعلي (Man-In-The-Middle Proxy) مفتوح المصدر مكتوب بلغة بايثون. يعمل كوسيط بين تطبيقك والخادم: يعترض جميع الطلبات والاستجابات، ويسمح لك بمشاهدتها، وتعديلها، وإعادة إنتاجها، وحفظها.

الفرق الرئيسي بين mitmproxy وخوادم الوكيل العادية هو القدرة على العمل مع حركة مرور HTTPS المشفرة. تقوم الأداة بإنشاء شهادات SSL ديناميكيًا لكل مجال، مما يسمح بفك تشفير الحركة في الوقت الفعلي دون التأثير على عمل التطبيق.

إليك بعض المهام النموذجية التي يحلها المطورون باستخدام mitmproxy:

  • تصحيح واجهة برمجة التطبيقات — ترى الطلبات والاستجابات الدقيقة، بما في ذلك الرؤوس، الجسم، رموز الحالة.
  • الهندسة العكسية — تحلل كيفية عمل التطبيقات والخدمات الخارجية.
  • الاختبار — تقوم بتغيير استجابات الخادم للتحقق من الحالات الحدية.
  • الأتمتة — تكتب سكربتات لتعديل الحركة بناءً على الشروط.
  • التسجيل وإعادة الإنتاج — تحفظ الجلسة وتعيد إنتاجها بدون خادم حقيقي.
  • تحليل الأمان — تتحقق مما إذا كان التطبيق يرسل بيانات غير ضرورية.

من المهم أن نفهم

mitmproxy هو أداة للاختبار والتطوير القانوني. استخدمه فقط لتحليل حركة مرور التطبيقات التي تقوم بتطويرها أو لديك الحق في اختبارها. اعتراض حركة المرور الخاصة بالآخرين بدون إذن ينتهك القوانين.

تأتي الأداة في ثلاثة أشكال: واجهة تفاعلية قائمة على النص mitmproxy، واجهة ويب mitmweb، وأداة سطر الأوامر mitmdump. جميعها تستخدم نفس النواة وتدعم سكربتات بايثون.

تثبيت mitmproxy على Windows وmacOS وLinux

يمكن تثبيت mitmproxy بعدة طرق. نوصي باستخدام pip — فهذا يضمن الحصول على أحدث إصدار وتحديث سهل.

التثبيت عبر pip (طريقة شاملة)

يتطلب Python 3.9 أو أحدث. تحقق من إصدار Python:

python --version
# أو
python3 --version

نقوم بتثبيت mitmproxy:

pip install mitmproxy

بعد التثبيت، تحقق:

mitmproxy --version
# يجب أن يظهر: mitmproxy 10.x.x

التثبيت عبر مديري الحزم

macOS (Homebrew):

brew install mitmproxy

Linux (Ubuntu/Debian):

sudo apt install mitmproxy
# أو عبر snap للحصول على أحدث إصدار:
sudo snap install mitmproxy

Windows: قم بتنزيل المثبت من الموقع الرسمي mitmproxy.org أو استخدم pip في PowerShell مع حقوق المسؤول.

التشغيل والتحقق الأساسي

بشكل افتراضي، يستمع mitmproxy على المنفذ 8080. نقوم بتشغيل واجهة الويب للبدء:

# تشغيل واجهة الويب على المنفذ 8080
mitmweb

# التشغيل على منفذ آخر
mitmweb --listen-port 9090

# واجهة سطر الأوامر
mitmproxy

بعد تشغيل mitmweb، افتح المتصفح على العنوان http://127.0.0.1:8081 — هذه هي واجهة الويب لعرض الحركة. يعمل الوكيل نفسه على المنفذ 8080.

إعداد شهادات SSL لاعتراض HTTPS

يتطلب اعتراض حركة مرور HTTPS تثبيت الشهادة الجذرية لـ mitmproxy في النظام أو المتصفح. بدون هذه الخطوة، سيظهر المتصفح تحذيرًا بشأن الاتصال غير الآمن، وسترفض العديد من التطبيقات العمل تمامًا.

كيف يعمل ذلك تقنيًا

عند التشغيل الأول لـ mitmproxy، يقوم تلقائيًا بإنشاء شهادة CA الجذرية ويحفظها في الدليل ~/.mitmproxy/. عندما يتصل العميل بموقع HTTPS عبر الوكيل، يقوم mitmproxy بإنشاء شهادة لهذا المجال في الوقت الفعلي، موقعة من CA الخاصة به. يثق العميل بهذه الشهادة إذا تمت إضافة CA إلى الموثوق بها — ويتم فك تشفير الحركة بشكل شفاف.

تثبيت الشهادة في النظام

توجد الشهادات في ~/.mitmproxy/:

  • mitmproxy-ca-cert.pem — لـ Linux/macOS
  • mitmproxy-ca-cert.cer — لـ Windows
  • mitmproxy-ca-cert.p12 — لـ iOS

macOS:

sudo security add-trusted-cert -d -r trustRoot \
  -k /Library/Keychains/System.keychain \
  ~/.mitmproxy/mitmproxy-ca-cert.pem

Linux (Ubuntu/Debian):

sudo cp ~/.mitmproxy/mitmproxy-ca-cert.pem \
  /usr/local/share/ca-certificates/mitmproxy.crt
sudo update-ca-certificates

Windows: انقر نقرًا مزدوجًا على الملف mitmproxy-ca-cert.cer → "تثبيت الشهادة" → "الكمبيوتر المحلي" → "مراكز الشهادات الجذرية الموثوقة".

تثبيت في متصفح Firefox

يستخدم Firefox مخزن الشهادات الخاص به. انتقل إلى: الإعدادات → الخصوصية والأمان → الشهادات → عرض الشهادات → مراكز الشهادات → استيراد. اختر الملف mitmproxy-ca-cert.pem وحدد "الثقة عند التعرف على مواقع الويب".

التحقق من العمل

قم بإعداد المتصفح لاستخدام الوكيل 127.0.0.1:8080 وافتح أي موقع HTTPS. يجب أن ترى حركة المرور المفككة في واجهة mitmweb. بدلاً من ذلك — افتح http://mitm.it عبر الوكيل المعد: سيظهر mitmproxy تعليمات تثبيت الشهادة لمنصتك.

ثلاث واجهات: mitmproxy وmitmweb وmitmdump

تشمل حزمة mitmproxy ثلاث أدوات بواجهات مختلفة لسيناريوهات عمل مختلفة. سيساعدك فهم الاختلافات في اختيار الأداة الصحيحة لكل مهمة.

الأداة الواجهة متى تستخدم الميزات
mitmproxy واجهة TUI قائمة على النص تصحيح تفاعلي في الطرفية يتطلب طرفية تدعم الألوان، فلتر قوي
mitmweb متصفح ويب تحليل مرئي للحركة واجهة مستخدم مريحة، دعم الفلاتر، تصدير
mitmdump CLI (stdout) سكربتات، CI/CD، أتمتة بدون تفاعلية، إخراج إلى ملف أو pipe

علامات التشغيل المفيدة

# تسجيل الحركة في ملف
mitmdump -w traffic.dump

# إعادة إنتاج الحركة المسجلة
mitmdump -r traffic.dump

# تصفية: فقط الطلبات إلى مجال معين
mitmproxy --filter "~d api.example.com"

# التشغيل في وضع الوكيل الشفاف
mitmproxy --mode transparent

# التشغيل كوكيل أعلى (سلسلة الوكلاء)
mitmproxy --mode upstream:http://upstream-proxy:8080

# تحديد منفذ معين
mitmweb --listen-port 9090 --web-port 9091

# التشغيل مع سكربت
mitmproxy -s my_script.py

بنية فلاتر mitmproxy

يدعم mitmproxy لغة فلاتر قوية لاختيار الطلبات المطلوبة:

# ~d — فلتر حسب المجال
~d api.example.com

# ~u — فلتر حسب URL (regex)
~u /api/v2/users

# ~m — فلتر حسب طريقة HTTP
~m POST

# ~s — فقط الاستجابات
~s ~c 404

# ~c — فلتر حسب رمز الحالة
~c 500

# الجمع (AND)
~d api.example.com & ~m POST

# الجمع (OR)
~c 404 | ~c 500

# NOT
!~d static.example.com

كتابة سكربتات بلغة بايثون: اعتراض وتعديل حركة المرور

السكربتات هي القوة العظمى لـ mitmproxy. من خلالها يمكنك تلقائيًا تعديل الطلبات والاستجابات، تسجيل البيانات بالتنسيق المطلوب، محاكاة أخطاء الخادم والعديد من الأمور الأخرى. تُكتب السكربتات بلغة بايثون وتستخدم نموذج الأحداث.

الأحداث الرئيسية (الخطافات)

الخطاف متى يتم استدعاؤه الكائن
request تم استلام طلب من العميل flow.request
response تم استلام استجابة من الخادم flow.response
error خطأ في الاتصال flow.error
tls_start_client بداية مصافحة TLS مع العميل tls_start

مثال 1: تسجيل الطلبات في ملف

# logger.py
import mitmproxy.http
import json
from datetime import datetime

def request(flow: mitmproxy.http.HTTPFlow) -> None:
    """نسجل كل طلب في ملف JSON."""
    log_entry = {
        "timestamp": datetime.now().isoformat(),
        "method": flow.request.method,
        "url": flow.request.pretty_url,
        "headers": dict(flow.request.headers),
        "body": flow.request.text if flow.request.text else None
    }
    with open("requests.log", "a") as f:
        f.write(json.dumps(log_entry, ensure_ascii=False) + "\n")

def response(flow: mitmproxy.http.HTTPFlow) -> None:
    """نسجل الاستجابات ذات رمز الخطأ."""
    if flow.response.status_code >= 400:
        print(f"[ERROR] {flow.request.method} {flow.request.pretty_url} "
              f"-> {flow.response.status_code}")

تشغيل السكربت:

mitmproxy -s logger.py

مثال 2: تعديل الطلبات — تغيير الرؤوس

# modify_headers.py
from mitmproxy import http

def request(flow: http.HTTPFlow) -> None:
    """نغير User-Agent ونضيف رأس مخصص."""
    if "api.example.com" in flow.request.pretty_host:
        # تغيير User-Agent
        flow.request.headers["User-Agent"] = (
            "Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) "
            "AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1"
        )
        # إضافة رأس تفويض
        flow.request.headers["X-Custom-Token"] = "test-token-12345"
        # إزالة الرأس
        if "X-Debug-Info" in flow.request.headers:
            del flow.request.headers["X-Debug-Info"]

مثال 3: تغيير استجابة الخادم (mock)

# mock_response.py
from mitmproxy import http
import json

def request(flow: http.HTTPFlow) -> None:
    """نعترض الطلب ونرجع استجابة mock، دون الاتصال بالخادم."""
    if flow.request.pretty_url.endswith("/api/v1/user/profile"):
        # إنشاء استجابة mock
        mock_data = {
            "id": 42,
            "name": "Test User",
            "email": "[email protected]",
            "premium": True  # نختبر وظيفة premium
        }
        flow.response = http.Response.make(
            200,  # رمز الحالة
            json.dumps(mock_data),  # جسم الاستجابة
            {"Content-Type": "application/json"}  # الرؤوس
        )

def response(flow: http.HTTPFlow) -> None:
    """نعدل الاستجابة الحقيقية من الخادم."""
    if "/api/v1/products" in flow.request.pretty_url:
        try:
            data = json.loads(flow.response.text)
            # نضيف حقلًا لكل منتج
            for product in data.get("items", []):
                product["debug_info"] = "intercepted"
            flow.response.text = json.dumps(data)
        except (json.JSONDecodeError, KeyError):
            pass

مثال 4: محاكاة اتصال بطيء وأخطاء

# chaos_testing.py
from mitmproxy import http
import time
import random

def response(flow: http.HTTPFlow) -> None:
    """هندسة الفوضى: تأخيرات وأخطاء عشوائية للاختبار."""
    # إضافة تأخير عشوائي من 0 إلى 2 ثانية
    if "api.example.com" in flow.request.pretty_host:
        delay = random.uniform(0, 2.0)
        time.sleep(delay)

    # 10% احتمال الاستجابة 503
    if random.random() < 0.1:
        flow.response = http.Response.make(
            503,
            json.dumps({"error": "Service Unavailable"}),
            {"Content-Type": "application/json"}
        )

اعتراض حركة مرور تطبيقات الموبايل

تحليل حركة مرور تطبيقات الموبايل هو أحد المهام الأكثر شيوعًا عند استخدام mitmproxy. هذا مفيد بشكل خاص عند الهندسة العكسية لواجهات برمجة التطبيقات الخاصة بتطبيقات الموبايل أو اختبار تطبيقك الخاص على جهاز حقيقي.

الإعداد على Android

الخطوة 1. تأكد من أن الهاتف والكمبيوتر في نفس شبكة Wi-Fi.

الخطوة 2. قم بتشغيل mitmproxy على الكمبيوتر:

mitmweb --listen-host 0.0.0.0 --listen-port 8080

الخطوة 3. على Android: الإعدادات → Wi-Fi → اضغط مع الاستمرار على الشبكة → تغيير الشبكة → متقدم → الوكيل → يدوي. أدخل عنوان IP للكمبيوتر والمنفذ 8080.

الخطوة 4. تثبيت الشهادة على Android: افتح المتصفح على الجهاز، وانتقل إلى http://mitm.it وقم بتنزيل الشهادة لـ Android. ثم: الإعدادات → الأمان → تثبيت الشهادة → شهادة CA.

Android 7+ وCertificate Pinning

بدءًا من Android 7.0، لا تثق التطبيقات افتراضيًا بشهادات CA المخصصة. لاعتراض حركة مرور هذه التطبيقات، ستحتاج إلى إما الوصول الجذري أو تعديل network_security_config.xml في APK. بالنسبة للتطبيقات التي تحتوي على SSL Pinning، استخدم Frida أو Xposed Framework لتجاوز التحقق من الشهادة.

الإعداد على iOS

الخطوة 1. قم بإعداد الوكيل بشكل مشابه لـ Android: الإعدادات → Wi-Fi → اضغط (i) بجانب الشبكة → إعداد الوكيل → يدوي.

الخطوة 2. افتح Safari وانتقل إلى http://mitm.it — قم بتنزيل الشهادة لـ iOS.

الخطوة 3. قم بتثبيت الملف: الإعدادات → الملف المحمل → تثبيت.

الخطوة 4. قم بتمكين الثقة في الشهادة: الإعدادات → عام → حول الجهاز → الثقة في الشهادات — قم بتشغيل المفتاح لـ mitmproxy.

اعتراض حركة مرور تطبيق معين عبر بايثون

# mobile_app_analyzer.py
from mitmproxy import http
import json
import re

# المجالات الخاصة بالتطبيق المستهدف
TARGET_DOMAINS = ["api.myapp.com", "cdn.myapp.com"]

def response(flow: http.HTTPFlow) -> None:
    """نحلل حركة مرور تطبيق الموبايل."""
    host = flow.request.pretty_host

    if not any(domain in host for domain in TARGET_DOMAINS):
        return

    # استخراج استجابات JSON
    content_type = flow.response.headers.get("content-type", "")
    if "application/json" in content_type:
        try:
            data = json.loads(flow.response.text)
            print(f"\n{'='*60}")
            print(f"URL: {flow.request.pretty_url}")
            print(f"Status: {flow.response.status_code}")
            print(f"Response: {json.dumps(data, indent=2, ensure_ascii=False)}")
        except json.JSONDecodeError:
            pass

    # البحث عن الرموز في رؤوس الطلب
    auth_header = flow.request.headers.get("authorization", "")
    if auth_header:
        print(f"[AUTH] Token found: {auth_header[:50]}...")

سلسلة الوكلاء: mitmproxy + وكيل أعلى

أحد السيناريوهات القوية هو استخدام mitmproxy بالتعاون مع خادم وكيل خارجي. هذا يسمح باعتراض وتحليل الحركة في نفس الوقت (عبر mitmproxy) وتوجيهها عبر عنوان IP خارجي (عبر الوكيل الأعلى). تُستخدم هذه المخططات عند اختبار واجهات برمجة التطبيقات المعتمدة على الموقع أو عند تطوير التطبيقات التي يجب أن تعمل عبر الوكيل.

وضع الوكيل الأعلى

# توجيه كل الحركة عبر وكيل HTTP أعلى
mitmproxy --mode upstream:http://proxy-host:port

# وكيل SOCKS5 أعلى
mitmproxy --mode upstream:socks5://proxy-host:port

# مع المصادقة
mitmproxy --mode upstream:http://user:password@proxy-host:port

# عبر mitmweb مع وكيل أعلى
mitmweb --mode upstream:http://proxy-host:port

في هذا الوضع، يستقبل mitmproxy الطلبات محليًا، يفك تشفير HTTPS، ويتيح لك تحليلها وتعديلها، ثم يمررها عبر الوكيل الخارجي. هذا مفيد بشكل خاص عند اختبار واجهات برمجة التطبيقات المتاحة فقط من مناطق معينة.

لمثل هذه المهام، تعتبر الوكلاء السكنيين خيارًا جيدًا — لديهم عناوين IP حقيقية لمستخدمين منزليين من البلدان المطلوبة، مما يسمح باختبار استجابات واجهة برمجة التطبيقات المعتمدة على الموقع بشكل صحيح.

اختيار ديناميكي للوكيل الأعلى في السكربت

# dynamic_upstream.py
from mitmproxy import http
from mitmproxy.net.server_spec import ServerSpec

# قائمة الوكلاء للتدوير
PROXY_LIST = [
    "http://proxy1.example.com:8080",
    "http://proxy2.example.com:8080",
    "http://proxy3.example.com:8080",
]

proxy_index = 0

def request(flow: http.HTTPFlow) -> None:
    """تدوير الوكيل الأعلى لكل طلب."""
    global proxy_index

    # توجيه الطلبات إلى واجهة برمجة التطبيقات عبر وكلاء مختلفين
    if "api.target.com" in flow.request.pretty_host:
        proxy_url = PROXY_LIST[proxy_index % len(PROXY_LIST)]
        proxy_index += 1
        flow.live.change_upstream_proxy_server(
            ServerSpec.from_url(proxy_url)
        )
        print(f"Using proxy: {proxy_url} for {flow.request.pretty_url}")

الوكيل الشفاف (transparent mode)

في الوضع الشفاف، لا يعرف التطبيق أن حركته يتم اعتراضها — لا حاجة لإعداد الوكيل في الإعدادات. يتطلب ذلك إعداد iptables/pf على مستوى نظام التشغيل:

# التشغيل في وضع transparent
mitmproxy --mode transparent --listen-port 8080

# إعداد iptables لإعادة توجيه الحركة (Linux)
sudo iptables -t nat -A OUTPUT -p tcp --dport 80 -j REDIRECT --to-port 8080
sudo iptables -t nat -A OUTPUT -p tcp --dport 443 -j REDIRECT --to-port 8080

سيناريوهات الاستخدام العملية mitmproxy

دعنا نستعرض بعض المهام المحددة التي يحلها المطورون باستخدام mitmproxy في المشاريع الحقيقية.

سيناريو 1: اختبار واجهة برمجة التطبيقات بدون تغيير الخادم

تخيل: تحتاج إلى التحقق من كيفية معالجة الواجهة الأمامية لاستجابة تحتوي على مصفوفة بيانات فارغة أو خطأ مصادقة 401، لكن من الصعب إعادة إنتاج ذلك على الخادم التجريبي. يسمح لك mitmproxy بتغيير الاستجابة مباشرة في الوقت الفعلي:

# test_edge_cases.py
from mitmproxy import http
import json

def response(flow: http.HTTPFlow) -> None:
    url = flow.request.pretty_url

    # اختبار: قائمة فارغة من المنتجات
    if "/api/products" in url and "test_empty=1" in url:
        flow.response.text = json.dumps({"items": [], "total": 0})

    # اختبار: رمز تفويض منتهي
    if "/api/user" in url and "test_auth=1" in url:
        flow.response = http.Response.make(
            401,
            json.dumps({"error": "Token expired", "code": "AUTH_001"}),
            {"Content-Type": "application/json"}
        )

    # اختبار: تجاوز حد الطلبات
    if "/api/" in url and "test_rate=1" in url:
        flow.response = http.Response.make(
            429,
            json.dumps({"error": "Too Many Requests", "retry_after": 60}),
            {"Content-Type": "application/json",
             "Retry-After": "60"}
        )

سيناريو 2: تسجيل وإعادة إنتاج الجلسة

مفيد لإنشاء تجهيزات اختبار أو عرض الوظائف بدون خادم حقيقي:

# تسجيل الجلسة في ملف
mitmdump -w session.dump --filter "~d api.example.com"

# إعادة إنتاج الجلسة المسجلة (offline)
mitmdump -r session.dump

# تحويل إلى تنسيق HAR للتحليل
mitmdump -r session.dump --flow-detail 3 > session.txt

سيناريو 3: توثيق واجهة برمجة التطبيقات تلقائيًا

# api_documenter.py
from mitmproxy import http
import json
from collections import defaultdict

# قاموس لتجميع المعلومات حول النقاط النهائية
endpoints = defaultdict(lambda: {"methods": set(), "status_codes": set(),
                                  "request_fields": set(), "response_fields": set()})

def _extract_fields(data, prefix=""):
    """نستخرج الحقول من JSON بشكل تكراري."""
    fields = set()
    if isinstance(data, dict):
        for key, value in data.items():
            full_key = f"{prefix}.{key}" if prefix else key
            fields.add(full_key)
            fields.update(_extract_fields(value, full_key))
    elif isinstance(data, list) and data:
        fields.update(_extract_fields(data[0], prefix))
    return fields

def response(flow: http.HTTPFlow) -> None:
    if "api.example.com" not in flow.request.pretty_host:
        return

    # تطبيع URL (إزالة ID)
    import re
    path = re.sub(r'/\d+', '/{id}', flow.request.path)
    endpoint = f"{flow.request.method} {path}"

    ep = endpoints[endpoint]
    ep["methods"].add(flow.request.method)
    ep["status_codes"].add(flow.response.status_code)

    # استخراج حقول الطلب
    if flow.request.text:
        try:
            req_data = json.loads(flow.request.text)
            ep["request_fields"].update(_extract_fields(req_data))
        except json.JSONDecodeError:
            pass

    # استخراج حقول الاستجابة
    if flow.response.text:
        try:
            resp_data = json.loads(flow.response.text)
            ep["response_fields"].update(_extract_fields(resp_data))
        except json.JSONDecodeError:
            pass

def done():
    """نخرج التوثيق عند الانتهاء."""
    print("\n=== توثيق واجهة برمجة التطبيقات ===\n")
    for endpoint, info in sorted(endpoints.items()):
        print(f"النقطة النهائية: {endpoint}")
        print(f"  رموز الحالة: {sorted(info['status_codes'])}")
        if info["request_fields"]:
            print(f"  حقول الطلب: {sorted(info['request_fields'])}")
        if info["response_fields"]:
            print(f"  حقول الاستجابة: {sorted(info['response_fields'])}")
        print()

سيناريو 4: اختبار استجابات معتمدة على الموقع

عند تطوير التطبيقات بمحتوى إقليمي، من المهم التحقق من كيفية استجابة واجهة برمجة التطبيقات للطلبات من دول مختلفة. لهذا، يتم تشغيل mitmproxy في وضع الوكيل الأعلى مع وكلاء مراكز البيانات من المناطق المطلوبة — هذه طريقة سريعة وموثوقة لمحاكاة الطلبات من دول معينة.

# geo_test.py
from mitmproxy import http

def response(flow: http.HTTPFlow) -> None:
    """نسجل الرؤوس والبيانات المعتمدة على الموقع."""
    # نرى ما المحتوى الذي يعيده الخادم
    geo_headers = ["cf-ipcountry", "x-country", "x-geo-country"]
    for header in geo_headers:
        value = flow.response.headers.get(header)
        if value:
            print(f"[GEO] {header}: {value} | URL: {flow.request.pretty_url}")

    # نبحث عن ذكر العملات واللغات في الاستجابة
    if flow.response.text:
        import re
        currencies = re.findall(r'"currency":\s*"([A-Z]{3})"', flow.response.text)
        locales = re.findall(r'"locale":\s*"([a-z]{2}-[A-Z]{2})"', flow.response.text)
        if currencies:
            print(f"[CURRENCY] {currencies}")
        if locales:
            print(f"[LOCALE] {locales}")

سيناريو 5: استخدام mitmproxy في CI/CD

يعد mitmdump مثاليًا للاختبارات التكاملية في خط أنابيب CI/CD — يتم تشغيله كعملية في الخلفية، يسجل الحركة وينتهي مع الاختبارات:

#!/bin/bash
# ci_test.sh

# تشغيل mitmdump في الخلفية
mitmdump -w test_traffic.dump -s ci_assertions.py &
MITM_PID=$!

# إعطاء الوكيل الوقت للإقلاع
sleep 1

# تشغيل الاختبارات مع الوكيل
export HTTP_PROXY=http://127.0.0.1:8080
export HTTPS_PROXY=http://127.0.0.1:8080
pytest tests/integration/ -v

# إيقاف mitmdump
kill $MITM_PID

# تحليل الحركة المسجلة
mitmdump -r test_traffic.dump -s analyze_traffic.py

يمكن أن يتحقق السكربت ci_assertions.py من أن التطبيق لا يقوم بإجراء طلبات غير ضرورية، ولا يرسل بيانات حساسة بشكل غير مشفر، ويمتثل لعقود واجهة برمجة التطبيقات.

سيناريو 6: تحليل حركة مرور المحلل

عند تطوير المحللات، يساعد mitmproxy في فهم الطلبات التي يقوم بها المتصفح عند تحميل الصفحة — بما في ذلك طلبات XHR/fetch إلى واجهة برمجة التطبيقات، التي لا تظهر في كود HTML المصدر. يسمح ذلك بالوصول مباشرة إلى واجهة برمجة التطبيقات بدلاً من تحليل HTML. عند تطوير مثل هذه الحلول، غالبًا ما تستخدم الوكلاء السكنيين لتدوير IP، لتجنب الحظر أثناء جمع البيانات.

الخاتمة

mitmproxy هو أحد أقوى الأدوات في ترسانة المطور للعمل مع حركة مرور HTTP/HTTPS. يجمع بين وظائف المصحح، بيئة الاختبار، موثق واجهة برمجة التطبيقات، وأداة لتحليل الأمان. تغطي ثلاث واجهات — قائمة على النص، ويب، وCLI — جميع السيناريوهات: من التصحيح التفاعلي إلى الأتمتة في CI/CD.

```