Scraper'ınız tarayıcıda sorunsuz açılan bir kategori sayfasında 403 alıyor ve hata mesajı durum kodundan başka bir şey söylemiyor. Tarayıcının gönderdiği istekle Python'un gönderdiği isteği yan yana görseniz farkı bir dakikada bulurdunuz, ama HTTPS ikisini de kapalı zarf gibi saklıyor. Kendi bilgisayarınızda çalışan bir MITM proxy bu zarfı yalnız sizin için açar.
Bu yazıda MITM proxy'nin HTTPS trafiğini nasıl okuduğunu anlatıyor, Charles, Fiddler ve mitmproxy'yi 2026 lisans koşullarıyla karşılaştırıyoruz. Ardından kök sertifikayı, kendi mobil uygulamalarınızın trafiğini, denenmiş bir Python kurulumunu ve yerel aracı bir üst proxy'ye (upstream proxy) zincirlemeyi ele alıyoruz. Anlatılan her şey kendi cihazınız ve uygulamanız ya da test etmek için yazılı izniniz olan bir sistem için geçerlidir.
MITM proxy nedir?
"Man-in-the-middle" (ortadaki adam) bir saldırının adıdır: biri iki tarafın arasına habersizce girer ve birbirlerine gönderdiklerini okur. MITM proxy aynı konumu hata ayıklama için kullanır. Aracı siz kurarsınız, trafik sizindir, sertifikasına da siz güvenirsiniz; yani kandırılan kimse yoktur. Şirketler aynı tekniği çalışanlarının bilgisayarlarında TLS denetimi için kullanır; o tarafı proxy ve güvenlik duvarı farkı yazısında anlattık.
Normal bir forward proxy (proxy sunucu nasıl çalışır) bir HTTPS isteğinde CONNECT example.com:443 satırından yalnız hedef sunucunun adını görür, sonra şifreli baytları taşır. MITM proxy ise şifreli bağlantıyı sizin makinenizde sonlandırır. Bu yüzden tam URL'yi, her header'ı (isteğe eşlik eden User-Agent, Cookie gibi başlık satırları) ve gövdeyi görür.
MITM proxy HTTPS trafiğini nasıl açar?
RFC 9110 tüneli, mesajları değiştirmeden ileten kör bir aktarıcı olarak tanımlar. Normal bir proxy CONNECT'ten sonra bu kurala uyar; MITM proxy ise sertifikasına güvenen istemciler için kuralı bilerek bozar. mitmproxy belgesinin anlattığı akış şöyledir:
- İstemci yerel araca
CONNECT example.com:443gönderir. - Araç, tüneli açmış gibi
200 Connection Establishedyanıtı döner. - İstemci TLS el sıkışmasını (şifreli bağlantıyı kuran ilk mesajlaşma) başlatır ve SNI alanında sunucunun adını bildirir.
- Araç o sunucuya TLS ile bağlanır ve sunucu sertifikasındaki adları (CN ve SAN) okur.
- Bu adlarla bir sertifika üretir ve yerel kök sertifikasıyla (CA, certificate authority, yani sertifika otoritesi) imzalar.
- İstemci bu CA'ya güveniyorsa el sıkışma tamamlanır; araç trafiği düz metin olarak okur, sonra sunucuya giderken yeniden şifreler.
İstemci CA'ya güvenmiyorsa 6. adım bir sertifika hatasıyla düşer, olması gereken de budur. Proxynet ağ geçidi 5. adımı hiçbir zaman yapmaz: CONNECT tünelini körlemesine aktarır. Bu yüzden HTTPS Proxy kullanırken cihazınıza kök sertifika kurmanız gerekmez.
Charles, Fiddler ve mitmproxy karşılaştırması
Tablo, üreticilerin Eylül 2026'daki kendi sayfalarına dayanıyor; fiyat yok, yalnız lisans modelleri var.
| Araç | Lisans | Platformlar | Arayüz | Varsayılan port | Upstream proxy | Otomasyon |
|---|---|---|---|---|---|---|
| Charles | 30 günlük denemeden sonra ücretli kullanıcı lisansı | Windows, macOS, Linux | Masaüstü uygulaması | Genellikle 8888 | HTTP, HTTPS ve SOCKS; Basic ya da NTLM kimlik doğrulama | Breakpoints, Rewrite, Map Local |
| Fiddler Everywhere | Abonelik, 10 günlük deneme | Windows, macOS, Linux | Masaüstü uygulaması | 8866 | Elle girilen proxy dizesi; Kerberos, Negotiate ya da NTLM kimlik doğrulama | Kurallar (Rules) |
| Fiddler Classic | 3 Ağustos 2026'dan beri yalnız ticari olmayan kullanım | Yalnız Windows | Masaüstü uygulaması | 8888 | Burada ele alınmadı | FiddlerScript |
| mitmproxy | Açık kaynak, MIT | Windows, macOS, Linux | Terminal, tarayıcı (mitmweb), komut satırı (mitmdump) | 8080 | upstream_auth (Basic) ile --mode upstream: | Python eklentileri, CI |
İstekleri bir pencerede düzenleyen mobil test (QA) ekiplerine Charles ve Fiddler Everywhere uyar. Kontrolü bir test paketine ya da CI hattına koymak isteyen geliştirici için mitmproxy daha uygundur; orada her adım bir Python fonksiyonudur. Burp Suite güvenlik testine yöneliktir ve bu yazının kapsamı dışında kalır.
Charles Proxy nedir, ne zaman seçilir?
Charles, kullanıcı lisansı almadan önce 30 gün deneyebileceğiniz bir masaüstü uygulamasıdır. Yalnız SSL Proxying listesindeki sunucuların trafiğini çözer (* bütün sunucular demektir), diğer HTTPS trafiğini açmadan iletir. Tipik bir kullanımda test mühendisi iPhone'un Wi-Fi proxy ayarını dizüstü bilgisayarın IP'sine ve 8888 portuna yönlendirir, Charles sorduğunda cihaza izin verir. Sonra Breakpoints ile istekleri düzenler, Map Local ile yanıtı bir dosyadan verir, bant genişliği kısıtlamasıyla (throttling) yavaş bir ağı taklit eder.
Fiddler nedir? Classic ve Everywhere farkı
Fiddler Classic yalnız Windows'ta çalışır, FiddlerScript'i destekler ve artık geliştirilmiyor. 3 Ağustos 2026'dan beri lisansı yalnız ticari olmayan kullanıma izin veriyor. Ticari kullanıcılara geçiş için 17 Eylül 2026'ya kadar süre tanındı ve ücretli bir Classic lisansı yok.
Fiddler Everywhere ticari üründür: Windows, macOS ve Linux'ta çalışır, 10 günlük denemeden sonra abonelikle kullanılır, HTTP/2 ve TLS 1.3 destekler ve 8866 portunu dinler. Kullanmak için HTTPS yakalamayı açarsınız, aracın kök sertifikasına güvenirsiniz ve oturumları sunucu adına göre filtrelersiniz.
mitmproxy nedir? Üç arayüz ve Python eklentileri
mitmproxy MIT lisanslıdır; 12.2.3 sürümü (12 Mayıs 2026) Python 3.12 ya da daha yenisini ister. Üç programla gelir: mitmproxy (terminal görünümü), mitmweb (tarayıcı görünümü) ve mitmdump (arayüzsüz, betikler ve CI için). Üçü de varsayılan olarak 8080 portunu dinler.
İlk açılışta ~/.mitmproxy klasöründe o kuruluma özgü CA'sını oluşturur. Özel anahtar (mitmproxy-ca.pem), her platform için hazırlanmış sertifika dosyalarının (mitmproxy-ca-cert.pem, .p12, .cer) yanında durur. Cihazda proxy ayarlıyken mitm.it adresi doğru dosyayı ve kurulum adımlarını gösterir. Eklenti (addon) ise fonksiyonları response gibi olayların adını taşıyan bir Python dosyasıdır.
Kök sertifika neden gerekir, güvenli mi?
Bir CA'nın özel anahtarına sahip olan kişi, o CA'ya güvenen her cihazda herhangi bir site için geçerli görünen bir sertifika üretebilir. Risk araçta değil, bu anahtardadır:
- Yalnız kendi aracınızın ürettiği CA. Ücretsiz proxy güvenliği yazımızda bir proxy servisinin kurmanızı istediği sertifikayı kurmayın dedik ve bu uyarı hâlâ geçerli: uzaktaki bir CA, trafiğinizi bir yabancının okumasına kapı açar. Kendi bilgisayarınızdaki araç farklıdır, çünkü anahtarı makinenizden hiç çıkmaz.
- Yalnız test cihazlarında, yalnız test süresince.
~/.mitmproxyklasörünü paylaşmayın, depoya commit etmeyin; iş bitince CA'yı kaldırın. - Aracın kontrollerini kapatmayın. mitmproxy'nin
ssl_insecureseçeneği sunucuya giden taraftaki sertifika kontrollerini atlar. Yardım metni, bu seçeneğin mitmproxy'nin kendisini de araya girme saldırısına açık bıraktığını söyler.
CA'yı kaldırmak için:
- Windows:
certmgr.msc> Güvenilen Kök Sertifika Yetkilileri > Sertifikalar. - macOS: Anahtar Zinciri Erişimi'nde aracın sertifikasını silin.
- iPhone: Ayarlar > Genel > VPN ve Aygıt Yönetimi > profil > Profili Sil.
- Android (Pixel): Ayarlar > Güvenlik ve gizlilik > Diğer güvenlik ayarları > Şifreleme ve kimlik bilgileri > Kullanıcı kimlik bilgileri. Diğer üreticilerde son iki adımdan önceki yol farklıdır.
Android ve iPhone'da kendi mobil uygulamanızın trafiğini görmek
Telefonun Wi-Fi proxy ayarını bilgisayarınızın IP adresine ve aracın portuna yönlendirin. Adımlar Android proxy ayarları ve iPhone proxy ayarları yazılarında.
Android. Ağ güvenliği yapılandırması belgesine göre Android 7.0 (API düzeyi 24) ve üstünü hedefleyen uygulamalar varsayılan olarak yalnız sistem CA'larına güvenir. Bu yüzden tarayıcı çalışırken uygulamanız TLS hatası verebilir. Kendi uygulamanıza bir debug-overrides bloğu ekleyin:
<!-- res/xml/network_security_config.xml -->
<network-security-config>
<debug-overrides>
<trust-anchors>
<certificates src="user" />
</trust-anchors>
</debug-overrides>
</network-security-config>Dosyayı manifest'te android:networkSecurityConfig="@xml/network_security_config" ile gösterin. android:debuggable false olduğunda Android bu bloğu yok sayar, yani yayın (release) build'i normal güven kurallarıyla çalışmaya devam eder.
iPhone. Profili kurduktan sonra Ayarlar > Genel > Hakkında > Sertifika Güven Ayarları altında sertifikaya tam güveni açın.
Sertifika sabitleme (pinning). Sertifika sabitleyen bir uygulama yalnız önceden tanımladığı sertifikayı kabul eder, bu yüzden aracın sertifikasını reddeder. Kendi uygulamanızda sabitlemeyi test build'inde ayarlayın. Başkasının uygulamasında sabitleme geliştiricinin kararıdır ve bu yazı orada durur.
İstekleri yakalamak, düzenlemek ve yeniden oynatmak
Üç araçla da bir isteği gönderilmeden önce durdurup header'ını değiştirebilir, bir hata ekranını test etmek için isteği yerel bir dosyayla yanıtlayabilir ve kaydedilmiş bir isteği yeniden gönderebilirsiniz. Böylece günde bir kez ortaya çıkan bir hatayı istediğiniz an tekrarlayabilirsiniz. mitmproxy'de -w flows.mitm akışları (flow) kaydeder, -C flows.mitm yeniden oynatır. Yeniden oynatmayı yalnız kendi API'nize ya da test etme izniniz olan bir endpoint'e, hız sınırları içinde yapın.
Bir web sayfasının arka plan isteği için DevTools yeter (XHR isteğini bulmak); yerel araç betikler ve uygulamalar içindir.
Python scraper'ında MITM proxy ile hata ayıklama
Girişteki 403'e dönelim: betiği mitmdump üzerinden geçiriyor, her yanıtı günlüğe yazıyor ve her hatada isteğin ayrıntılarını basıyoruz. Python 3.13, mitmproxy 12.2.3 ve Requests 2.34.2 ile denendi (pip install mitmproxy requests).
debug_addon.py eklentisi her yanıt için bir satır yazar. 4xx ve 5xx yanıtlarda ise genellikle tarayıcınınkinden farklı olan header'ları, çerez gönderilip gönderilmediğini ve gövdenin başını basar:
"""mitmdump eklentisi: her yanıt için bir satır, her 4xx ve 5xx için istek ayrıntıları."""
from mitmproxy import http
WATCH = ("User-Agent", "Accept", "Accept-Language", "Accept-Encoding")
def response(flow: http.HTTPFlow) -> None:
req, resp = flow.request, flow.response
print(f"{resp.status_code} {req.method} {req.pretty_url}")
if resp.status_code < 400:
return
for name in WATCH:
print(f" {name}: {req.headers.get(name, '(not sent)')}")
print(f" Cookie: {'sent' if 'Cookie' in req.headers else 'not sent'}")
body = resp.get_content(strict=False) or b"" # gzip ya da br ise açılmış hâli
print(f" body: {body[:300].decode('utf-8', 'replace')!r}")scraper_debug.py betiği proxy'yi yalnız DEBUG_PROXY tanımlıyken kullanır ve yerel CA'ya verify üzerinden güvenir. Requests belgesi verify=False'un uygulamayı MitM saldırılarına açık bıraktığı konusunda uyarır; bu yüzden burada hiç kullanılmaz:
"""Sayfaları Requests ile çeker; DEBUG_PROXY tanımlıysa istekler yerel mitmdump'tan geçer."""
import os
import sys
from pathlib import Path
import requests
DEBUG_PROXY = os.environ.get("DEBUG_PROXY") # ör. http://127.0.0.1:8080
MITM_CA = Path.home() / ".mitmproxy" / "mitmproxy-ca-cert.pem"
session = requests.Session()
session.headers.update({
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
"(KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36",
"Accept-Language": "en-GB,en;q=0.9",
})
def request_options():
options = {"timeout": (5, 30)} # saniye cinsinden (bağlantı, okuma)
if DEBUG_PROXY:
if not MITM_CA.is_file():
sys.exit(f"{MITM_CA} not found: start mitmdump once, it creates the CA there.")
# İstek başına verilir: Session.proxies değerini HTTPS_PROXY ezebilir.
options["proxies"] = {"http": DEBUG_PROXY, "https": DEBUG_PROXY}
options["verify"] = str(MITM_CA) # yerel CA'ya güven, asla verify=False kullanma
return options
def fetch(url):
try:
return session.get(url, **request_options())
except requests.exceptions.SSLError as exc:
sys.exit(f"TLS check failed for {url}: is {MITM_CA} the CA of the "
f"mitmdump that is running?\n{exc}")
except requests.exceptions.ProxyError as exc:
sys.exit(f"Debug proxy {DEBUG_PROXY} did not answer: is mitmdump running?\n{exc}")
if __name__ == "__main__":
for url in sys.argv[1:] or ["https://httpbin.org/headers"]:
resp = fetch(url)
print(resp.status_code, url)
for name, value in resp.request.headers.items():
print(f" {name}: {value}")mitmdump'ı yalnız loopback adresinde (127.0.0.1, yalnız bu bilgisayardan erişilebilen adres) başlatın:
mitmdump --listen-host 127.0.0.1 -p 8080 -s debug_addon.py -w flows.mitmSonra betiği ikinci bir terminalde çalıştırın (PowerShell'de önce $env:DEBUG_PROXY = "http://127.0.0.1:8080" tanımlayın):
DEBUG_PROXY=http://127.0.0.1:8080 python scraper_debug.py https://httpbin.org/headers https://httpbin.org/status/403mitmdump penceresi şunu yazdı (bağlantı satırları çıkarıldı):
200 GET https://httpbin.org/headers
403 GET https://httpbin.org/status/403
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36
Accept: */*
Accept-Language: en-GB,en;q=0.9
Accept-Encoding: gzip, deflate, br
Cookie: not sent
body: ''Şimdi sayfayı aynı proxy'ye ayarlı bir tarayıcıda açın. Tipik bulgular şunlardır: tarayıcı text/html,... gönderirken betiğin Accept: */* göndermesi ya da önceki bir sayfadan gelmesi gereken çerezin eksik olması. İkincisi betiğin bir adımı atladığını gösterir (Python'da oturum ve çerez yönetimi). Site tarayıcı dışındaki istemcileri bilerek reddediyorsa bu onun cevabıdır: API'sini kullanın ya da izin isteyin.
Yanlış bir CA dosyasıyla betik CERTIFICATE_VERIFY_FAILED hatası ve bizim ipucu mesajımızla durdu. mitmdump --set server=false -C flows.mitm -s debug_addon.py komutu iki isteği yeniden oynattı ve dinleyici açmadan kapandı.
Sunucu betiğinizin değil, aracın TLS el sıkışmasını görür. Bu yüzden TLS parmak izine bakan bir site araç açıkken farklı yanıt verebilir; sonucu DEBUG_PROXY olmadan yapılan bir çalıştırmayla karşılaştırın. 429 için yeniden deneme scraping'de HTTP hata kodları yazısında, ortam değişkenleri wget ile proxy kullanımı yazısında, proxy döndürme Python'da proxy'ler nasıl döndürülür yazısında, kütüphane seçimi de HTTPX, Requests ve AIOHTTP karşılaştırması yazısında.
Başka bir ülkeden test: yerel aracı bir proxy'ye zincirlemek
Uygulamanızın Almanya'daki bir kullanıcıya gösterdiği fiyatları görmek için cihazın trafiğini önce yerel MITM aracına (şifre çözme burada olur), oradan bir üst proxy'ye, sonra hedefe gönderin. HTTPS hedeflerde üst proxy yalnız yeniden şifrelenmiş tüneli taşır; Proxynet bu tüneli çözmez.
mitmproxy. Upstream modu her isteği üst proxy'ye aktarır, upstream_auth de Basic kimlik doğrulama ekler:
mitmdump --listen-host 127.0.0.1 --mode upstream:http://pr.proxynet.io:8000 --set upstream_auth=user:pass -s debug_addon.pyBunu şifre isteyen yerel bir proxy'ye karşı denedik. Şifre yanlışken betik mitmdump'tan 502 aldı. Nedeni mitmdump günlüğünde görünüyordu: üst proxy CONNECT isteğini 407 ile reddetmişti.
Charles. External Proxies ayarı HTTP, HTTPS ve SOCKS için ayrı adres alır. Basic ya da NTLM kimlik doğrulamayı ve joker karakterli bir bypass listesini destekler.
Fiddler Everywhere. Settings > Gateway ayarı elle girilen bir proxy dizesi alır. Belge, üst proxy kimlik doğrulaması için kullanıcı adı ve şifreyi değil, Kerberos, Negotiate ve NTLM yöntemlerini sayar. Proxynet ile bunun yerine bilgisayarınızın IP adresini yetkilendirin (user:pass ve IP whitelist).
Mobil operatör IP'si için Mobil Proxy, ev bağlantısı için Residential Proxy kullanın; senaryonun tamamı uygulama testi sayfamızda.
MITM proxy ne için kullanılır?
- Scraper ve tarayıcı:
200'ü403'e çeviren header'ı bulun (HTTP hata kodları). - Postman: Postman'in gönderdiği son header'ları görün (Postman proxy ayarları).
- Kendi uygulamanız: Test telefonunda API çağrılarını ve hataları izleyin (uygulama testi).
- Proxy header'ları: Düz HTTP'de
Viaya daX-Forwarded-Forheader'ını yakalayın (şeffaf, anonim ve elite proxy farkları). - Bir
407: Kimlik bilgilerinin üst proxy'ye ulaşıp ulaşmadığını kontrol edin (proxy kimlik doğrulama yöntemleri). - Proxy kontrolleri: Bir işe başlamadan önce çıkış IP'sini ve yanıtları doğrulayın (proxy nasıl test edilir).
Sık yapılan hatalar
- CA'yı kurulu bırakmak. Anahtarı sonradan ele geçiren herkes o cihazda kendini herhangi bir site gibi gösterebilir.
- Kodu
verify=Falseile yayına almak. Onun yerineverify'ı CA dosyasına yönlendirin. - Android uygulamasının kullanıcı CA'sına güvenmesini beklemek. API düzeyi 24 ve üstündeki uygulamalar, buna izin veren bir debug build dışında onu yok sayar.
- Charles'ta sunucuyu SSL Proxying listesine eklememek. Yalnız şifreli
CONNECTkayıtlarını görürsünüz, içerik görünmez. - Bütün ağ arayüzlerinde dinlemek. Bizim testimizde
--listen-hostverilmediğindemitmdump0.0.0.0ve::adreslerine bağlandı. Bir telefonun bağlanması gerekmiyorsa127.0.0.1'e bağlayın. - Flow dosyalarını özensizce paylaşmak. İçlerinde çerezler ve header'lar bulunur.
- Ağustos 2026'dan sonra iş yerinde Fiddler Classic kullanmak. Lisansı yalnız ticari olmayan kullanıma izin verir.
Karar rehberi
| İhtiyaç | Öneri |
|---|---|
| Scraper'ın isteğini tarayıcınınkiyle karşılaştırmak | Küçük bir eklentiyle mitmproxy; Requests'te verify CA dosyasına ayarlı |
| Mobil test için istekleri bir pencerede düzenlemek | Charles ya da Fiddler Everywhere |
| Windows'ta ticari iş için Fiddler | Fiddler Classic değil, Fiddler Everywhere ya da başka bir araç |
| Kendi Android uygulamanızın HTTPS trafiği | Yalnız debug build'de debug-overrides |
| Uygulamanızı başka ülkedeki bir kullanıcı gibi test etmek | Yerel aracı mobil ya da residential proxy'ye zincirleyin (uygulama testi) |
| Bir web sayfasının arka plan isteğini bulmak | DevTools Network sekmesi; MITM aracı gerekmez |
Sıkça sorulan sorular
MITM proxy kullanmak yasal mı?
Kendi cihazınızda ve uygulamanızda ya da test etmek için yazılı izniniz olan bir sistemde kullandığınızda bir hata ayıklama aracıdır. Başkalarının trafiğini gizlice okumak ise ayrı bir eylemdir. Scraping tarafı için web scraping yasal mı yazısına bakın.
mitmproxy güvenli mi?
Araç açık kaynaklıdır ve yerelde çalışır. Risk, ~/.mitmproxy içindeki CA özel anahtarındadır: onu kimseyle paylaşmayın, CA'yı yalnız test cihazlarına kurun ve işiniz bitince kaldırın.
Fiddler Classic hâlâ ücretsiz mi, Fiddler Everywhere'den farkı ne?
3 Ağustos 2026'dan beri Fiddler Classic yalnız ticari olmayan kullanımda ücretsizdir; Windows'ta çalışır ve artık geliştirilmiyor. Fiddler Everywhere ise HTTP/2 ve TLS 1.3 destekleyen, birden çok platformda çalışan ücretli üründür.
Charles Proxy'nin ücretsiz bir alternatifi var mı?
mitmproxy açık kaynaklıdır ve aynı platformlarda çalışır; mitmweb ile tarayıcıda da kullanılabilir. Charles'ın kendisi de 30 gün denenebilir.
Android'de sertifikayı kurdum, uygulamamın trafiği neden hâlâ görünmüyor?
API düzeyi 24 ve üstünü hedefleyen uygulamalar varsayılan olarak yalnız sistem CA'larına güvenir. Kendi uygulamanızın debug build'inde debug-overrides ile kullanıcı CA'larına izin verin. Uygulama sertifika sabitliyorsa sabitlemeyi test build'inde ayarlayın.
MITM proxy, normal proxy ve VPN arasındaki fark nedir?
Normal proxy ve VPN şifreli trafiği okumadan taşır ve çıkış IP'nizi değiştirir (proxy ve VPN farkı). MITM proxy trafiği sizin bilgisayarınızda açar ve bir üst proxy'ye zincirlenmedikçe IP'nizi değiştirmez.
Özet
MITM proxy kendi trafiğinizi okumak için kullanılan bir araçtır. CA'sı sizin makinenizde üretilir, yalnız test cihazlarına kurulur ve test bitince kaldırılır. Pencerede çalışmak için Charles ve Fiddler Everywhere, betik ve CI için mitmproxy uygundur. Testin başka bir ülkeden gelmesi gerektiğinde yerel aracı bir üst proxy'ye zincirleyin; başlangıç noktası uygulama testi sayfamız.




