Bloga geri dön

mitmproxy Geliştiricileri İçin: HTTPS Trafiğini Yakalama ve Analiz Etme, Python Kod Örnekleri ile

mitmproxy, HTTPS trafiğini yakalamak ve analiz etmek için güçlü bir araçtır. Kurulum, SSL sertifikalarının ayarlanması, script yazımı ve gerçek uygulama senaryolarını inceliyoruz.

📅5 Ağustos 2026
```html

Mobil uygulamanızı geliştiriyor ve sunucuya hangi isteklerin gönderildiğini anlamıyor musunuz? API'nin farklı koşullar altında nasıl davrandığını test etmeniz veya yanıtı yakalayıp verileri anlık olarak değiştirmeyi mi istiyorsunuz? mitmproxy, tüm bu görevleri çözmenizi sağlar — bu, istemci ve sunucu arasındaki HTTP ve HTTPS trafiğini tamamen kontrol etmenizi sağlayan açık kaynaklı ve ücretsiz bir araçtır.

mitmproxy nedir ve geliştirici için neden gereklidir

mitmproxy, Python ile yazılmış etkileşimli bir MITM proxy (Man-In-The-Middle Proxy) aracıdır. Uygulamanız ile sunucu arasında bir aracı olarak çalışır: tüm istekleri ve yanıtları yakalar, görüntülemenizi, değiştirmenizi, yeniden oynatmanızı ve kaydetmenizi sağlar.

mitmproxy'nin normal proxy sunucularından en büyük farkı, şifreli HTTPS trafiği ile çalışabilme yeteneğidir. Araç, her alan için dinamik olarak SSL sertifikaları üretir, bu da trafiği anlık olarak çözümlemenizi sağlar ve uygulamanın çalışmasını bozmaz.

Geliştiricilerin mitmproxy ile çözdüğü tipik görevler şunlardır:

  • API Hatası Ayıklama — başlıklar, gövde, durum kodları dahil olmak üzere tam istekleri ve yanıtları görebilirsiniz.
  • Geridönüş Mühendisliği — üçüncü taraf uygulamaların ve hizmetlerin nasıl çalıştığını analiz edersiniz.
  • Test Etme — sunucu yanıtlarını değiştirebilir ve sınır durumlarını kontrol edebilirsiniz.
  • Otomasyon — koşullara göre trafiği değiştirmek için betikler yazarsınız.
  • Kayıt ve Yeniden Oynatma — oturumu kaydedebilir ve gerçek bir sunucu olmadan yeniden oynatabilirsiniz.
  • Güvenlik Analizi — uygulamanın gereksiz verileri iletmediğini kontrol edersiniz.

Anlamak önemlidir

mitmproxy, yasal test ve geliştirme için bir araçtır. Sadece geliştirdiğiniz veya test etme hakkına sahip olduğunuz uygulamaların trafiğini analiz etmek için kullanın. Başkalarının trafiğini izinsiz yakalamak yasaları ihlal eder.

Araç, üç versiyonla gelir: etkileşimli konsol arayüzü mitmproxy, web arayüzü mitmweb ve komut satırı aracı mitmdump. Üçü de aynı çekirdeği kullanır ve Python betiklerini destekler.

Windows, macOS ve Linux'ta mitmproxy kurulumu

mitmproxy birkaç şekilde kurulabilir. pip kullanmanızı öneririz — bu, güncel bir sürüm sağlar ve kolay güncelleme imkanı sunar.

pip ile kurulum (evrensel yol)

Python 3.9 veya daha yenisi gereklidir. Python sürümünü kontrol edin:

python --version
# veya
python3 --version

mitmproxy'i kuruyoruz:

pip install mitmproxy

Kurulumdan sonra kontrol edin:

mitmproxy --version
# Çıktı: mitmproxy 10.x.x olmalıdır

Paket yöneticileri ile kurulum

macOS (Homebrew):

brew install mitmproxy

Linux (Ubuntu/Debian):

sudo apt install mitmproxy
# veya güncel sürüm için snap ile:
sudo snap install mitmproxy

Windows: Resmi web sitesinden mitmproxy.org yükleyicisini indirin veya PowerShell'de yönetici haklarıyla pip kullanın.

Başlatma ve temel kontrol

Varsayılan olarak mitmproxy 8080 portunu dinler. Çalışmaya başlamak için web arayüzünü başlatıyoruz:

# 8080 portunda web arayüzünü başlatma
mitmweb

# Farklı bir portta başlatma
mitmweb --listen-port 9090

# Konsol arayüzü
mitmproxy

mitmweb başlatıldıktan sonra, tarayıcıyı http://127.0.0.1:8081 adresine açın — bu, trafiği görüntülemek için web arayüzüdür. Proxy kendisi 8080 portunda çalışır.

HTTPS yakalamak için SSL sertifikalarının yapılandırılması

HTTPS trafiğini yakalamak, mitmproxy'nin kök sertifikasını sisteme veya tarayıcıya yüklemeyi gerektirir. Bu adım olmadan, tarayıcı güvenli olmayan bir bağlantı uyarısı gösterecek ve birçok uygulama çalışmayı tamamen reddedecektir.

Teknik olarak nasıl çalışır

mitmproxy ilk başlatıldığında otomatik olarak bir kök CA sertifikası oluşturur ve bunu ~/.mitmproxy/ dizinine kaydeder. Bir istemci, proxy üzerinden bir HTTPS sitesine bağlandığında, mitmproxy bu alan için anlık olarak bir sertifika oluşturur ve bunu kendi CA'sı ile imzalar. İstemci, CA güvenilirler listesine eklenmişse bu sertifikaya güvenir ve çözümleme şeffaf bir şekilde gerçekleşir.

Sisteme sertifika yükleme

Sertifikalar ~/.mitmproxy/ dizininde bulunmaktadır:

  • mitmproxy-ca-cert.pem — Linux/macOS için
  • mitmproxy-ca-cert.cer — Windows için
  • mitmproxy-ca-cert.p12 — iOS için

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 dosyasına çift tıklayın → "Sertifikayı Yükle" → "Yerel Bilgisayar" → "Güvenilir Kök Sertifika Otoriteleri".

Firefox tarayıcısına yükleme

Firefox kendi sertifika deposunu kullanır. Gidin: Ayarlar → Gizlilik ve Güvenlik → Sertifikalar → Sertifikaları Görüntüle → Sertifika Otoriteleri → İçe Aktar. mitmproxy-ca-cert.pem dosyasını seçin ve "Web sitelerini tanımlarken güven" seçeneğini işaretleyin.

Çalışma kontrolü

Tarayıcıyı 127.0.0.1:8080 proxy'sini kullanacak şekilde ayarlayın ve herhangi bir HTTPS sitesini açın. mitmweb arayüzünde şifrelenmiş trafiği görmelisiniz. Alternatif olarak, ayarlanmış proxy üzerinden http://mitm.it adresini açın: mitmproxy, platformunuz için sertifika yükleme talimatlarını gösterecektir.

Üç arayüz: mitmproxy, mitmweb ve mitmdump

mitmproxy paketi, farklı çalışma senaryoları için farklı arayüzlere sahip üç yardımcı program içerir. Farklılıkları anlamak, her görev için doğru aracı seçmenize yardımcı olacaktır.

Araç Arayüz Ne zaman kullanılmalı Özellikler
mitmproxy Konsol TUI Terminalde etkileşimli hata ayıklama Renk destekleyen bir terminal gerektirir, güçlü filtre
mitmweb Web tarayıcısı Görsel trafik analizi Kullanıcı dostu UI, filtre desteği, dışa aktarma
mitmdump CLI (stdout) Betikler, CI/CD, otomasyon Etkileşim olmadan, dosyaya veya pipe'a çıktı

Kullanışlı başlatma bayrakları

# Trafiği dosyaya kaydetme
mitmdump -w traffic.dump

# Kaydedilen trafiği yeniden oynatma
mitmdump -r traffic.dump

# Filtreleme: belirli bir alan adına yalnızca istekler
mitmproxy --filter "~d api.example.com"

# Şeffaf proxy modunda başlatma
mitmproxy --mode transparent

# Upstream proxy olarak başlatma (proxy zinciri)
mitmproxy --mode upstream:http://upstream-proxy:8080

# Belirli bir port belirtme
mitmweb --listen-port 9090 --web-port 9091

# Betik ile başlatma
mitmproxy -s my_script.py

mitmproxy filtre sözdizimi

mitmproxy, gerekli istekleri seçmek için güçlü bir filtre dilini destekler:

# ~d — alan adına göre filtre
~d api.example.com

# ~u — URL'ye göre filtre (regex)
~u /api/v2/users

# ~m — HTTP yöntemine göre filtre
~m POST

# ~s — yalnızca yanıtlar
~s ~c 404

# ~c — durum koduna göre filtre
~c 500

# Birleştirme (VE)
~d api.example.com & ~m POST

# Birleştirme (VEYA)
~c 404 | ~c 500

# DEĞİL
!~d static.example.com

Python'da betik yazımı: trafiği yakalama ve değiştirme

Betikler, mitmproxy'nin ana süper gücüdür. Onlar sayesinde istekleri ve yanıtları otomatik olarak değiştirebilir, verileri istenen formatta kaydedebilir, sunucu hatalarını taklit edebilir ve daha fazlasını yapabilirsiniz. Betikler Python ile yazılır ve olay tabanlı bir model kullanır.

Temel olaylar (hook'lar)

Hook Ne zaman çağrılır Nesne
request İstemciden bir istek alındığında flow.request
response Sunucudan bir yanıt alındığında flow.response
error Bağlantı hatası flow.error
tls_start_client İstemci ile TLS el sıkışmasının başlangıcı tls_start

Örnek 1: İstekleri dosyaya kaydetme

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

def request(flow: mitmproxy.http.HTTPFlow) -> None:
    """Her isteği JSON dosyasına kaydediyoruz."""
    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:
    """Hata kodu olan yanıtları kaydediyoruz."""
    if flow.response.status_code >= 400:
        print(f"[HATA] {flow.request.method} {flow.request.pretty_url} "
              f"-> {flow.response.status_code}")

Betik çalıştırma:

mitmproxy -s logger.py

Örnek 2: İstekleri değiştirme — başlıkları değiştirme

# modify_headers.py
from mitmproxy import http

def request(flow: http.HTTPFlow) -> None:
    """User-Agent'ı değiştiriyoruz ve özel bir başlık ekliyoruz."""
    if "api.example.com" in flow.request.pretty_host:
        # User-Agent'ı değiştirme
        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"
        )
        # Yetkilendirme başlığı ekleme
        flow.request.headers["X-Custom-Token"] = "test-token-12345"
        # Başlığı kaldırma
        if "X-Debug-Info" in flow.request.headers:
            del flow.request.headers["X-Debug-Info"]

Örnek 3: Sunucu yanıtını değiştirme (mock)

# mock_response.py
from mitmproxy import http
import json

def request(flow: http.HTTPFlow) -> None:
    """İsteği yakalıyoruz ve sunucuya başvurmadan mock yanıtı döndürüyoruz."""
    if flow.request.pretty_url.endswith("/api/v1/user/profile"):
        # Mock yanıt oluşturma
        mock_data = {
            "id": 42,
            "name": "Test User",
            "email": "[email protected]",
            "premium": True  # Premium işlevselliği test ediyoruz
        }
        flow.response = http.Response.make(
            200,  # Durum kodu
            json.dumps(mock_data),  # Yanıt gövdesi
            {"Content-Type": "application/json"}  # Başlıklar
        )

def response(flow: http.HTTPFlow) -> None:
    """Gerçek sunucu yanıtını değiştiriyoruz."""
    if "/api/v1/products" in flow.request.pretty_url:
        try:
            data = json.loads(flow.response.text)
            # Her ürüne bir alan ekliyoruz
            for product in data.get("items", []):
                product["debug_info"] = "intercepted"
            flow.response.text = json.dumps(data)
        except (json.JSONDecodeError, KeyError):
            pass

Örnek 4: Yavaş bağlantı ve hataları taklit etme

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

def response(flow: http.HTTPFlow) -> None:
    """Kaos mühendisliği: test için rastgele gecikmeler ve hatalar."""
    # 0 ile 2 saniye arasında rastgele bir gecikme ekliyoruz
    if "api.example.com" in flow.request.pretty_host:
        delay = random.uniform(0, 2.0)
        time.sleep(delay)

    # %10 olasılıkla 503 yanıtı
    if random.random() < 0.1:
        flow.response = http.Response.make(
            503,
            json.dumps({"error": "Service Unavailable"}),
            {"Content-Type": "application/json"}
        )

Mobil uygulamaların trafiğini yakalama

Mobil uygulamaların trafiğini analiz etmek, mitmproxy kullanırken en sık karşılaşılan görevlerden biridir. Bu, özellikle mobil uygulamaların API'lerini geridönüş mühendisliği ile analiz ederken veya kendi uygulamanızı gerçek bir cihazda test ederken faydalıdır.

Android'de yapılandırma

Adım 1. Telefonun ve bilgisayarın aynı Wi-Fi ağında olduğundan emin olun.

Adım 2. Bilgisayarda mitmproxy'i başlatın:

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

Adım 3. Android'de: Ayarlar → Wi-Fi → ağı basılı tutun → Ağı Değiştir → Gelişmiş → Proxy → Manuel. Bilgisayarın IP'sini ve 8080 portunu girin.

Adım 4. Android'de sertifika yükleme: cihazda tarayıcıyı açın, http://mitm.it adresine gidin ve Android için sertifikayı indirin. Ardından: Ayarlar → Güvenlik → Sertifikayı Yükle → CA Sertifikası.

Android 7+ ve Sertifika Pinning

Android 7.0'dan itibaren, uygulamalar varsayılan olarak kullanıcı CA sertifikalarına güvenmez. Bu tür uygulamaların trafiğini yakalamak için ya root erişimi ya da APK'daki network_security_config.xml dosyasının değiştirilmesi gerekecektir. SSL Pinning olan uygulamalar için sertifika kontrolünü atlamak için Frida veya Xposed Framework kullanın.

iOS'ta yapılandırma

Adım 1. Proxy'yi Android'deki gibi ayarlayın: Ayarlar → Wi-Fi → ağın yanındaki (i) simgesine tıklayın → Proxy'yi Ayarla → Manuel.

Adım 2. Safari'yi açın ve http://mitm.it adresine gidin — iOS için sertifikayı indirin.

Adım 3. Profili yükleyin: Ayarlar → Yüklenen Profil → Yükle.

Adım 4. Sertifikaya güveni etkinleştirin: Ayarlar → Genel → Hakkında → Sertifikalara Güven — mitmproxy için anahtarı etkinleştirin.

Belirli bir uygulamanın trafiğini Python ile yakalama

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

# Hedef uygulamanın alan adları
TARGET_DOMAINS = ["api.myapp.com", "cdn.myapp.com"]

def response(flow: http.HTTPFlow) -> None:
    """Mobil uygulamanın trafiğini analiz ediyoruz."""
    host = flow.request.pretty_host

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

    # JSON yanıtlarını çıkarıyoruz
    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"Durum: {flow.response.status_code}")
            print(f"Yanıt: {json.dumps(data, indent=2, ensure_ascii=False)}")
        except json.JSONDecodeError:
            pass

    # İstek başlıklarında token'ları arıyoruz
    auth_header = flow.request.headers.get("authorization", "")
    if auth_header:
        print(f"[AUTH] Token bulundu: {auth_header[:50]}...")

Proxy zinciri: mitmproxy + upstream proxy

Güçlü senaryolardan biri, mitmproxy'yi harici bir proxy sunucusu ile birlikte kullanmaktır. Bu, trafiği (mitmproxy üzerinden) yakalayıp analiz etmenizi ve harici bir IP adresi üzerinden yönlendirmenizi sağlar (upstream proxy aracılığıyla). Bu tür bir düzenleme, coğrafi olarak bağımlı API'leri test ederken veya proxy üzerinden çalışması gereken uygulamalar geliştirirken kullanılır.

Upstream proxy modu

# Tüm trafiği upstream HTTP proxy'si üzerinden yönlendirme
mitmproxy --mode upstream:http://proxy-host:port

# Upstream SOCKS5 proxy
mitmproxy --mode upstream:socks5://proxy-host:port

# Kimlik doğrulama ile
mitmproxy --mode upstream:http://user:password@proxy-host:port

# mitmweb ile upstream üzerinden
mitmweb --mode upstream:http://proxy-host:port

Bu modda mitmproxy, istekleri yerel olarak alır, HTTPS'yi çözer, analiz etmenize ve değiştirmenize olanak tanır ve ardından harici bir proxy üzerinden iletir. Bu, yalnızca belirli bölgelerden erişilebilen API'leri test ederken özellikle kullanışlıdır.

Bu tür görevler için rezidans proxy'leri iyi bir seçimdir — bunlar, gerekli ülkelerden gerçek ev kullanıcılarının IP adreslerine sahiptir, bu da coğrafi olarak bağımlı API yanıtlarını doğru bir şekilde test etmenizi sağlar.

Betikte dinamik upstream proxy seçimi

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

# Dönüşümlü proxy listesi
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:
    """Her istek için upstream proxy'yi döndürme."""
    global proxy_index

    # API'ye yönlendirilmiş istekleri farklı proxy'ler üzerinden yönlendiriyoruz
    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"Kullanılan proxy: {proxy_url} {flow.request.pretty_url} için")

Şeffaf proxy (transparent mode)

Şeffaf modda uygulama, trafiğinin yakalandığını bilmez — ayarlarda proxy ayarlamanız gerekmez. Bu, işletim sistemi düzeyinde iptables/pf yapılandırması gerektirir:

# Şeffaf modda başlatma
mitmproxy --mode transparent --listen-port 8080

# Trafiği yönlendirmek için iptables yapılandırması (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'nin pratik uygulama senaryoları

Geliştiricilerin mitmproxy ile gerçek projelerde çözdüğü belirli görevleri inceleyelim.

Senaryo 1: Sunucuyu değiştirmeden API test etme

Hayal edin: frontend'in boş bir veri dizisi yanıtını veya 401 yetkilendirme hatasını nasıl işlediğini kontrol etmeniz gerekiyor, ancak bunu test sunucusunda yeniden oluşturmak zor. mitmproxy, yanıtı anlık olarak değiştirme imkanı sunar:

# test_edge_cases.py
from mitmproxy import http
import json

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

    # Test: Boş ürün listesi
    if "/api/products" in url and "test_empty=1" in url:
        flow.response.text = json.dumps({"items": [], "total": 0})

    # Test: Süresi dolmuş token
    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"}
        )

    # Test: İstek limitinin aşılması
    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"}
        )

Senaryo 2: Oturum kaydı ve yeniden oynatma

Gerçek bir sunucu olmadan test fixture'ları oluşturmak veya işlevselliği göstermek için yararlıdır:

# Oturumu dosyaya kaydetme
mitmdump -w session.dump --filter "~d api.example.com"

# Kaydedilen oturumu yeniden oynatma (offline)
mitmdump -r session.dump

# Analiz için HAR formatına dönüştürme
mitmdump -r session.dump --flow-detail 3 > session.txt

Senaryo 3: Otomatik API belgelendirmesi

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

# Endpoint bilgilerini biriktirmek için sözlük
endpoints = defaultdict(lambda: {"methods": set(), "status_codes": set(),
                                  "request_fields": set(), "response_fields": set()})

def _extract_fields(data, prefix=""):
    """JSON'dan alanları özyinelemeli olarak çıkarıyoruz."""
    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'yi normalleştiriyoruz (ID'yi kaldırıyoruz)
    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)

    # İstek alanlarını çıkarıyoruz
    if flow.request.text:
        try:
            req_data = json.loads(flow.request.text)
            ep["request_fields"].update(_extract_fields(req_data))
        except json.JSONDecodeError:
            pass

    # Yanıt alanlarını çıkarıyoruz
    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():
    """Tamamlandığında belgelendirmeyi yazdırıyoruz."""
    print("\n=== API BELGELENDİRMESİ ===\n")
    for endpoint, info in sorted(endpoints.items()):
        print(f"Endpoint: {endpoint}")
        print(f"  Durum kodları: {sorted(info['status_codes'])}")
        if info["request_fields"]:
            print(f"  İstek alanları: {sorted(info['request_fields'])}")
        if info["response_fields"]:
            print(f"  Yanıt alanları: {sorted(info['response_fields'])}")
        print()

Senaryo 4: Coğrafi bağımlı yanıtları test etme

Bölgesel içerik ile uygulama geliştirirken, API'nin farklı ülkelerden gelen isteklere nasıl yanıt verdiğini kontrol etmek önemlidir. Bunun için mitmproxy, gerekli bölgelerden data center proxy'leri ile upstream modda çalıştırılır — bu, belirli ülkelerden gelen istekleri taklit etmenin hızlı ve güvenilir bir yoludur.

# geo_test.py
from mitmproxy import http

def response(flow: http.HTTPFlow) -> None:
    """Coğrafi bağımlı başlıkları ve verileri kaydediyoruz."""
    # Sunucunun hangi içeriği döndürdüğüne bakıyoruz
    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}")

    # Yanıtta para birimleri ve yerelleştirmeleri arıyoruz
    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}")

Senaryo 5: mitmproxy'yi CI/CD'de kullanma

mitmdump, CI/CD pipeline'ında entegrasyon testleri için mükemmel bir seçimdir — arka planda bir işlem olarak başlatılır, trafiği kaydeder ve testlerle birlikte sona erer:

#!/bin/bash
# ci_test.sh

# mitmdump'ı arka planda başlatıyoruz
mitmdump -w test_traffic.dump -s ci_assertions.py &
MITM_PID=$!

# Proxy'nin başlatılması için zaman tanıyoruz
sleep 1

# Proxy ile testleri başlatıyoruz
export HTTP_PROXY=http://127.0.0.1:8080
export HTTPS_PROXY=http://127.0.0.1:8080
pytest tests/integration/ -v

# mitmdump'ı durduruyoruz
kill $MITM_PID

# Kaydedilen trafiği analiz ediyoruz
mitmdump -r test_traffic.dump -s analyze_traffic.py

ci_assertions.py betiği, uygulamanın gereksiz istekler yapmadığını, hassas verileri şifrelenmemiş olarak iletmediğini ve API sözleşmelerine uyduğunu kontrol edebilir.

Senaryo 6: Parsel verisi trafiğini analiz etme

Parsel geliştirirken, mitmproxy, tarayıcının bir sayfa yüklerken yaptığı istekleri — HTML kaynak kodunda görünmeyen XHR/fetch istekleri de dahil olmak üzere — anlamaya yardımcı olur. Bu, doğrudan sitenin API'sine erişim sağlamanıza olanak tanır, böylece HTML'yi parsellemek yerine doğrudan API'ye başvurabilirsiniz. Bu tür çözümler geliştirirken, veri toplama sırasında engellemelerden kaçınmak için genellikle rezidans proxy'leri kullanılır.

Sonuç

mitmproxy, HTTP/HTTPS trafiği ile çalışmak için geliştiricinin en güçlü araçlarından biridir. Hata ayıklayıcı, test ortamı, API belgelendiricisi ve güvenlik analizi aracı işlevlerini bir araya getirir. Konsol, web ve CLI olmak üzere üç arayüz, etkileşimli hata ayıklamadan CI/CD'de otomasyona kadar tüm senaryoları kapsar.

```