---
title: "پروکسی MITM چیست؟ راهنمای Charles، Fiddler و mitmproxy"
description: "پروکسی MITM ترافیک خودتان را از ابزاری محلی می‌گذراند تا درخواست و پاسخ HTTPS را بخوانید. Charles، Fiddler و mitmproxy را برای اشکال‌زدایی مقایسه می‌کنیم."
url: https://proxynet.io/fa/blog/mitm-proxy
date: 2026-09-24
author: "Acar Diveroli"
category: "مبانی پروکسی, آموزش‌ها"
lang: fa
---

# پروکسی MITM چیست؟ راهنمای Charles، Fiddler و mitmproxy

اسکرپر شما روی یک صفحه دسته‌بندی `403` می‌گیرد، در حالی که همان صفحه در مرورگر بی‌دردسر باز می‌شود، و خطا جز کد وضعیت چیزی نمی‌گوید. اگر درخواست مرورگر و درخواست Python را کنار هم می‌دیدید، تفاوت در یک دقیقه پیدا می‌شد، اما HTTPS روی هر دو مهر و موم گذاشته است. یک پروکسی MITM روی رایانه خودتان این مهر و موم را فقط برای شما باز می‌کند.

این راهنما توضیح می‌دهد پروکسی MITM چگونه HTTPS را می‌خواند، Charles، Fiddler و mitmproxy را با شرایط مجوزشان در 2026 مقایسه می‌کند و به گواهی ریشه، برنامه‌های موبایل خودتان، یک راه‌اندازی آزموده‌شده در Python و زنجیر کردن ابزار به یک پروکسی بالادستی می‌پردازد. همه‌چیز بر این فرض است که با دستگاه و برنامه خودتان کار می‌کنید، یا با سیستمی که اجازه کتبی آزمودنش را دارید.

> **نکته: پاسخ کوتاه**
>
> پروکسی MITM ابزاری برای اشکال‌زدایی است که روی رایانه خودتان، میان مرورگر، اسکریپت یا برنامه شما و اینترنت قرار می‌گیرد. برای خواندن HTTPS، برای هر سایت در همان لحظه یک گواهی می‌سازد و آن را با یک گواهی ریشه محلی امضا می‌کند که در نخستین اجرا ساخته شده است. جای این گواهی ریشه فقط روی دستگاه آزمایشی شما و فقط در مدت آزمون است. Charles برنامه دسکتاپ پولی است، Fiddler Everywhere با اشتراک کار می‌کند، مجوز Fiddler Classic از 3 اوت 2026 فقط استفاده غیرتجاری را مجاز می‌داند و mitmproxy متن‌باز است و با Python برنامه‌نویسی می‌شود.

## پروکسی MITM چیست؟

«مرد میانی» (man-in-the-middle) نام یک حمله است: کسی بی‌خبر از دو طرف میان آن‌ها قرار می‌گیرد و آنچه می‌فرستند را می‌خواند. پروکسی MITM از همین جایگاه برای اشکال‌زدایی استفاده می‌کند. ابزار را خودتان نصب می‌کنید، ترافیک مال خودتان است و به گواهی آن خودتان اعتماد می‌کنید، پس کسی فریب نمی‌خورد. شرکت‌ها این روش را برای بازرسی TLS روی رایانه‌های کارکنان به کار می‌برند؛ آن بخش به نوشته [پروکسی و فایروال](/fa/blog/proxy-vs-firewall) مربوط است.

یک فوروارد پروکسی معمولی ([سرور پروکسی چگونه کار می‌کند](/fa/blog/what-is-a-proxy-server)) از یک درخواست HTTPS فقط میزبان مقصد را می‌بیند، آن هم از سطر `CONNECT example.com:443`، و پس از آن بایت‌های رمزنگاری‌شده را جابه‌جا می‌کند. پروکسی MITM اتصال رمزنگاری‌شده را روی رایانه شما پایان می‌دهد، پس URL کامل، همه هدرها و بدنه را می‌بیند.

## پروکسی MITM ترافیک HTTPS را چگونه باز می‌کند؟

[⁦RFC 9110⁩](https://www.rfc-editor.org/rfc/rfc9110.html#name-connect) تونل را واسطه‌ای کور (blind relay) توصیف می‌کند که پیام‌ها را بی‌آنکه تغییر دهد منتقل می‌کند. پروکسی معمولی پس از `CONNECT` به این قاعده پایبند می‌ماند؛ پروکسی MITM آن را عمداً می‌شکند، آن هم فقط برای کلاینت‌هایی که به گواهی‌اش اعتماد دارند. بر پایه [توضیح mitmproxy درباره این روند](https://docs.mitmproxy.org/stable/concepts/how-mitmproxy-works/):

1. کلاینت `CONNECT example.com:443` را به ابزار محلی می‌فرستد.
2. ابزار با `200 Connection Established` پاسخ می‌دهد، گویی تونل را باز کرده است.
3. کلاینت دست‌دادن TLS را آغاز می‌کند و نام میزبان را در فیلد SNI می‌آورد.
4. ابزار از راه TLS به همان میزبان وصل می‌شود و نام‌های درون گواهی سرور (CN و SAN) را می‌خواند.
5. گواهی‌ای با همان نام‌ها می‌سازد و آن را با گواهی ریشه محلی خود (CA، مرجع صدور گواهی) امضا می‌کند.
6. اگر کلاینت به این CA اعتماد داشته باشد، دست‌دادن کامل می‌شود و ابزار ترافیک را به‌صورت متن ساده می‌خواند و سپس آن را برای ارسال به سرور دوباره رمزنگاری می‌کند.

اگر کلاینت به CA اعتماد نداشته باشد، گام 6 با خطای گواهی شکست می‌خورد و درست هم همین است. گیت‌وی Proxynet هرگز گام 5 را انجام نمی‌دهد: تونل `CONNECT` را کورکورانه منتقل می‌کند، پس [پروکسی HTTPS](https://proxynet.io/fa/https-proxy) به هیچ گواهی ریشه‌ای روی دستگاه شما نیاز ندارد.

## مقایسه Charles، Fiddler و mitmproxy

بر پایه صفحه‌های خود سازندگان در سپتامبر 2026؛ فقط مدل مجوز، بدون قیمت.

| ابزار | مجوز | پلتفرم‌ها | رابط | پورت پیش‌فرض | پروکسی بالادستی | خودکارسازی |
|---|---|---|---|---|---|---|
| Charles | مجوز کاربر پولی پس از دوره آزمایشی 30 روزه | Windows، macOS، Linux | برنامه دسکتاپ | معمولاً 8888 | HTTP، HTTPS و SOCKS؛ احراز هویت Basic یا NTLM | Breakpoints، Rewrite، Map Local |
| Fiddler Everywhere | اشتراک، دوره آزمایشی 10 روزه | Windows، macOS، Linux | برنامه دسکتاپ | 8866 | رشته پروکسی دستی؛ احراز هویت Kerberos، Negotiate یا NTLM | Rules |
| Fiddler Classic | از 3 اوت 2026 فقط استفاده غیرتجاری | فقط Windows | برنامه دسکتاپ | 8888 | در این راهنما بررسی نشده است | FiddlerScript |
| mitmproxy | متن‌باز، MIT | Windows، macOS، Linux | ترمینال، مرورگر (`mitmweb`)، خط فرمان (`mitmdump`) | 8080 | `--mode upstream:` همراه با `upstream_auth` (Basic) | افزونه‌های Python، CI |

Charles و Fiddler Everywhere به کار تیم‌های QA موبایل می‌آیند که درخواست‌ها را در یک پنجره ویرایش می‌کنند؛ mitmproxy به کار توسعه‌دهندگانی می‌آید که این بررسی را درون مجموعه تست یا CI می‌خواهند، جایی که هر گام یک تابع Python است. Burp Suite برای آزمون امنیتی ساخته شده است که بیرون از دامنه این راهنماست.

## Charles Proxy چیست و چه زمانی آن را انتخاب کنید؟

Charles برنامه‌ای دسکتاپ است که می‌توانید 30 روز امتحانش کنید و سپس مجوز کاربر بخرید. فقط میزبان‌هایی را رمزگشایی می‌کند که در فهرست [SSL Proxying](https://www.charlesproxy.com/documentation/proxying/ssl-proxying/) آن باشند (`*` یعنی همه میزبان‌ها) و باقی ترافیک HTTPS را بی‌آنکه باز کند عبور می‌دهد. آزماینده پروکسی Wi-Fi دستگاه iPhone را روی لپ‌تاپ و پورت 8888 تنظیم می‌کند، وقتی Charles می‌پرسد به دستگاه اجازه می‌دهد و سپس با Breakpoints درخواست‌ها را ویرایش می‌کند، با Map Local از یک فایل پاسخ می‌دهد و با محدودسازی سرعت (throttling) شبکه‌ای کند را شبیه‌سازی می‌کند.

## Fiddler چیست؟ Classic و Everywhere

**Fiddler Classic** فقط روی Windows اجرا می‌شود، دیگر توسعه داده نمی‌شود و FiddlerScript دارد. از 3 اوت 2026 مجوز آن فقط استفاده غیرتجاری را مجاز می‌داند؛ کاربران تجاری تا 17 سپتامبر 2026 فرصت داشتند به ابزار دیگری بروند و [مجوز پولی برای Classic وجود ندارد](https://www.telerik.com/fiddler/fiddler-classic/commercial-use).

**Fiddler Everywhere** محصول تجاری است: Windows، macOS و Linux، اشتراک پس از دوره آزمایشی 10 روزه، پشتیبانی از ⁦HTTP/2⁩ و ⁦TLS 1.3⁩ و پورت 8866. ضبط HTTPS را روشن می‌کنید، به گواهی ریشه آن اعتماد می‌کنید و نشست‌ها را بر اساس میزبان فیلتر می‌کنید.

## mitmproxy چیست؟ سه رابط و افزونه‌های Python

mitmproxy مجوز MIT دارد؛ نسخه 12.2.3 (12 مه 2026) به ⁦Python 3.12⁩ یا جدیدتر نیاز دارد. سه ابزار همراه آن است: `mitmproxy` (نمای ترمینال)، `mitmweb` (نمای مرورگر) و `mitmdump` (بدون رابط، برای اسکریپت‌ها و CI)، و هر سه به‌طور پیش‌فرض روی پورت 8080 کار می‌کنند.

در نخستین اجرا [CA خود را](https://docs.mitmproxy.org/stable/concepts/certificates/) در `~/.mitmproxy` می‌سازد که مختص همان نصب است: کلید خصوصی (`mitmproxy-ca.pem`) کنار فایل‌های گواهی برای هر پلتفرم (`mitmproxy-ca-cert.pem`، `.p12`، `.cer`) قرار دارد. وقتی پروکسی روی دستگاهی تنظیم شده باشد، `mitm.it` فایل مناسب و مراحل نصب را پیشنهاد می‌کند. افزونه (addon) یک فایل Python است که تابع‌هایش به نام رویدادهایی مانند `response` نام‌گذاری شده‌اند.

## چرا به گواهی ریشه نیاز دارید و آیا امن است؟

هر کس کلید خصوصی یک CA را در دست داشته باشد، می‌تواند برای هر سایتی گواهی‌ای بسازد که روی همه دستگاه‌هایی که به آن CA اعتماد دارند معتبر به نظر برسد. خطر در همین کلید است، نه در ابزار:

- **فقط CA ساخته‌شده به دست ابزار خودتان.** [راهنمای امنیت پروکسی رایگان](/fa/blog/are-free-proxies-safe) ما می‌گوید گواهی‌ای را که یک سرویس پروکسی می‌خواهد نصب نکنید و این توصیه همچنان پابرجاست: CA راه دور به یک غریبه اجازه می‌دهد ترافیک شما را بخواند. ابزاری که روی رایانه خودتان است فرق دارد، چون کلیدش هرگز از رایانه شما بیرون نمی‌رود.
- **فقط روی دستگاه‌های آزمایشی و فقط در مدت آزمون.** `~/.mitmproxy` را با کسی به اشتراک نگذارید یا commit نکنید و پس از پایان کار CA را حذف کنید.
- **بررسی‌های خود ابزار را روشن نگه دارید.** گزینه `ssl_insecure` در mitmproxy بررسی گواهی در سمت سرور را کنار می‌گذارد و متن راهنمای آن هشدار می‌دهد که این کار خود mitmproxy را در برابر شنود آسیب‌پذیر می‌کند.

برای حذف CA:

- **Windows:** در `certmgr.msc` به Trusted Root Certification Authorities > Certificates بروید.
- **macOS:** گواهی ابزار را در Keychain Access حذف کنید.
- **iPhone:** مسیر Settings > General > VPN & Device Management را باز کنید، پروفایل را انتخاب کنید و Remove Profile را بزنید.
- **اندروید (Pixel):** به Settings > Security & privacy > More security settings > Encryption & credentials > User credentials بروید؛ در گوشی‌های سازندگان دیگر، بخش پیش از دو گام آخر فرق دارد.

## دیدن ترافیک برنامه موبایل خودتان در اندروید و iPhone

پروکسی Wi-Fi گوشی را روی آدرس IP رایانه‌تان و پورت ابزار تنظیم کنید؛ روش کار در [تنظیمات پروکسی اندروید](/fa/blog/android-proxy-settings) و [تنظیمات پروکسی iPhone](/fa/blog/iphone-proxy) آمده است.

**اندروید.** طبق مستندات [پیکربندی امنیت شبکه](https://developer.android.com/privacy-and-security/security-config)، برنامه‌هایی که ⁦Android 7.0⁩ (سطح ⁦API 24⁩) یا جدیدتر را هدف می‌گیرند به‌طور پیش‌فرض فقط به CAهای سیستمی اعتماد می‌کنند، پس ممکن است برنامه شما با خطای TLS از کار بیفتد در حالی که مرورگر کار می‌کند. در برنامه خودتان یک بلوک `debug-overrides` اضافه کنید:

```xml
<!-- res/xml/network_security_config.xml -->
<network-security-config>
    <debug-overrides>
        <trust-anchors>
            <certificates src="user" />
        </trust-anchors>
    </debug-overrides>
</network-security-config>
```

آن را با `android:networkSecurityConfig="@xml/network_security_config"` در manifest معرفی کنید. وقتی `android:debuggable` برابر `false` باشد، اندروید این بلوک را نادیده می‌گیرد، پس نسخه release همان قواعد عادی اعتماد را نگه می‌دارد.

**iPhone.** پس از نصب پروفایل، اعتماد کامل را در [Settings > General > About > Certificate Trust Settings](https://support.apple.com/en-us/102390) فعال کنید.

**پین کردن گواهی (pinning).** برنامه‌ای که گواهی‌ها را پین می‌کند گواهی ابزار را رد می‌کند. در برنامه خودتان، pinning را در نسخه آزمایشی تنظیم کنید؛ در برنامه دیگران، pinning تصمیم توسعه‌دهنده است و این راهنما همین‌جا متوقف می‌شود.

## رهگیری، ویرایش و بازپخش درخواست‌ها

هر سه ابزار به شما اجازه می‌دهند یک درخواست را پیش از ارسال نگه دارید و هدری را در آن تغییر دهید، به یک درخواست با فایلی محلی پاسخ دهید تا صفحه خطا را بیازمایید، و درخواستی ذخیره‌شده را دوباره بفرستید تا باگی که روزی یک بار پیش می‌آید هر وقت خواستید تکرار شود. در mitmproxy، `-w flows.mitm` جریان‌ها (flows) را ذخیره می‌کند و `-C flows.mitm` آن‌ها را بازپخش می‌کند. بازپخش را فقط روی API خودتان یا نقطه اتصالی که اجازه آزمودنش را دارید و در چارچوب محدودیت نرخ آن انجام دهید.

برای درخواست پس‌زمینه یک صفحه وب، DevTools کافی است ([یافتن درخواست XHR](/fa/blog/static-vs-dynamic-pages))؛ ابزار محلی برای اسکریپت‌ها و برنامه‌هاست.

## اشکال‌زدایی اسکرپر Python با پروکسی MITM

برگردیم به همان `403`: اسکریپت را از `mitmdump` عبور می‌دهیم، هر پاسخ را ثبت می‌کنیم و برای هر خطا جزئیات درخواست را چاپ می‌کنیم. آزموده‌شده با ⁦Python 3.13⁩، ⁦mitmproxy 12.2.3⁩ و ⁦Requests 2.34.2⁩ (`pip install mitmproxy requests`).

افزونه، یعنی `debug_addon.py`، برای هر پاسخ یک سطر چاپ می‌کند و برای `4xx` و `5xx` هدرهایی را که معمولاً با هدرهای مرورگر فرق دارند، فرستاده شدن یا نشدن کوکی و ابتدای بدنه را نشان می‌دهد:

```python
"""mitmdump addon: one line per response, request details for every 4xx and 5xx."""
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""  # decompressed if gzip or br
    print(f"    body: {body[:300].decode('utf-8', 'replace')!r}")
```

اسکریپت، یعنی `scraper_debug.py`، فقط وقتی `DEBUG_PROXY` تنظیم شده باشد از پروکسی استفاده می‌کند و از راه `verify` به CA محلی اعتماد می‌کند. مستندات Requests هشدار می‌دهد که [`verify=False` برنامه را در برابر حمله‌های MitM آسیب‌پذیر می‌کند](https://requests.readthedocs.io/en/latest/user/advanced/)، پس این گزینه اینجا هرگز به کار نمی‌رود:

```python
"""Fetch pages with Requests; set DEBUG_PROXY to route them through a local mitmdump."""
import os
import sys
from pathlib import Path

import requests

DEBUG_PROXY = os.environ.get("DEBUG_PROXY")  # e.g. 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)}  # (connect, read) in seconds
    if DEBUG_PROXY:
        if not MITM_CA.is_file():
            sys.exit(f"{MITM_CA} not found: start mitmdump once, it creates the CA there.")
        # Passed per request: a Session.proxies value can be overridden by HTTPS_PROXY.
        options["proxies"] = {"http": DEBUG_PROXY, "https": DEBUG_PROXY}
        options["verify"] = str(MITM_CA)  # trust the local CA, never verify=False
    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` را فقط روی آدرس loopback اجرا کنید:

```bash
mitmdump --listen-host 127.0.0.1 -p 8080 -s debug_addon.py -w flows.mitm
```

سپس اسکریپت را در ترمینال دوم اجرا کنید (در PowerShell، نخست `$env:DEBUG_PROXY = "http://127.0.0.1:8080"` را تنظیم کنید):

```bash
DEBUG_PROXY=http://127.0.0.1:8080 python scraper_debug.py https://httpbin.org/headers https://httpbin.org/status/403
```

پنجره `mitmdump` این خروجی را چاپ کرد (سطرهای مربوط به اتصال حذف شده‌اند):

```text
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: ''
```

اکنون صفحه را در مرورگری باز کنید که روی همان پروکسی تنظیم شده است. `Accept: */*` در برابر `text/html,...` مرورگر، یا نبود کوکی‌ای که باید از صفحه قبلی می‌آمد، یافته‌های رایج‌اند؛ دومی یعنی اسکریپت گامی را جا انداخته است ([نشست و کوکی در Python](/fa/blog/python-login-session-cookies)). اگر سایت عمداً کلاینت‌های غیرمرورگر را رد می‌کند، پاسخش همین است: از API آن استفاده کنید یا اجازه بخواهید.

یک فایل CA نادرست اسکریپت را با `CERTIFICATE_VERIFY_FAILED` و راهنمایی ما متوقف کرد. دستور `mitmdump --set server=false -C flows.mitm -s debug_addon.py` هر دو درخواست را بازپخش کرد و بی‌آنکه پورتی برای شنیدن باز کند بسته شد.

سرور دست‌دادن TLS ابزار را می‌بیند، نه دست‌دادن اسکریپت شما را، پس سایتی که [اثر انگشت TLS](/fa/blog/tls-fingerprinting) را بررسی می‌کند ممکن است تا وقتی ابزار روشن است پاسخ دیگری بدهد؛ نتیجه را با اجرایی بدون `DEBUG_PROXY` مقایسه کنید. تلاش دوباره برای `429` در [کدهای وضعیت HTTP در وب اسکرپینگ](/fa/blog/http-status-codes-web-scraping)، متغیرهای محیطی در [پروکسی در wget](/fa/blog/wget-proxy)، چرخش پروکسی در [چرخاندن پروکسی در Python](/fa/blog/how-to-rotate-proxies-in-python) و انتخاب کتابخانه در [مقایسه HTTPX، Requests و AIOHTTP](/fa/blog/httpx-vs-requests-vs-aiohttp) آمده است.

## آزمون از کشوری دیگر: زنجیر کردن ابزار محلی به یک پروکسی

برای دیدن قیمت‌هایی که برنامه شما به کاربری در آلمان نشان می‌دهد، ترافیک دستگاه را به ابزار MITM محلی بفرستید (رمزگشایی همان‌جا انجام می‌شود)، از آنجا به یک پروکسی بالادستی و سپس به مقصد. در مقصدهای HTTPS، پروکسی بالادستی فقط تونلی را جابه‌جا می‌کند که دوباره رمزنگاری شده است؛ Proxynet آن را رمزگشایی نمی‌کند.

**mitmproxy.** حالت upstream هر درخواست را به پروکسی بالادستی می‌فرستد و `upstream_auth` احراز هویت Basic را اضافه می‌کند:

```bash
mitmdump --listen-host 127.0.0.1 --mode upstream:http://pr.proxynet.io:8000 --set upstream_auth=user:pass -s debug_addon.py
```

این را با یک پروکسی محلی که رمز عبور می‌خواهد آزمودیم. با رمز نادرست، اسکریپت از `mitmdump` پاسخ `502` گرفت و لاگ آن علت را نشان داد: پروکسی بالادستی `CONNECT` را با `407` رد کرده بود.

**Charles.** بخش [External Proxies](https://www.charlesproxy.com/documentation/configuration/external-proxies/) برای HTTP، HTTPS و SOCKS نشانی‌های جداگانه می‌گیرد، همراه با احراز هویت Basic یا NTLM و فهرستی از استثناها (bypass) که نویسه عام (wildcard) را می‌پذیرد.

**Fiddler Everywhere.** بخش Settings > Gateway یک رشته پروکسی دستی می‌گیرد و مستندات برای احراز هویت بالادستی [Kerberos، Negotiate و NTLM](https://www.telerik.com/fiddler/fiddler-everywhere/documentation/installation-and-setup/advanced-installation/configuring-fiddler-alongside-proxy-auth) را نام می‌برد، نه نام کاربری و رمز عبور. با Proxynet، به‌جای آن آدرس IP رایانه‌تان را مجاز کنید ([user:pass و لیست سفید IP](/fa/blog/proxy-authentication-methods)).

برای IP اپراتور موبایل از [پروکسی موبایل](https://proxynet.io/fa/mobile-proxy) و برای اتصال خانگی از [پروکسی مسکونی](https://proxynet.io/fa/residential-proxy) استفاده کنید؛ سناریوی کامل در صفحه [تست اپلیکیشن](/fa/app-testing) ما آمده است.

## پروکسی MITM برای چه کاری به کار می‌رود؟

- **اسکرپر در برابر مرورگر:** هدری را پیدا کنید که `200` را به `403` تبدیل می‌کند ([کدهای وضعیت HTTP](/fa/blog/http-status-codes-web-scraping)).
- **Postman:** هدرهای نهایی‌ای را که Postman می‌فرستد ببینید ([تنظیم پروکسی در Postman](/fa/blog/postman-proxy)).
- **برنامه خودتان:** فراخوانی‌های API و خطاها را روی یک گوشی آزمایشی دنبال کنید ([تست اپلیکیشن](/fa/app-testing)).
- **هدرهای پروکسی:** `Via` یا `X-Forwarded-For` را در HTTP ساده پیدا کنید ([سطوح ناشناسی پروکسی](/fa/blog/anonymous-proxy-levels)).
- **یک `407`:** بررسی کنید که اطلاعات ورود به پروکسی بالادستی می‌رسد یا نه ([روش‌های احراز هویت پروکسی](/fa/blog/proxy-authentication-methods)).
- **بررسی پروکسی:** پیش از اجرای یک کار، IP خروجی و پاسخ‌ها را تأیید کنید ([چگونه پروکسی را آزمایش کنیم](/fa/blog/how-to-test-a-proxy)).

## اشتباهات رایج

- **نصب‌شده رها کردن CA.** هر کس بعدها به کلید دست پیدا کند، می‌تواند در برابر آن دستگاه خود را جای هر سایتی جا بزند.
- **انتشار کد با `verify=False`.** به‌جای آن `verify` را به فایل CA اشاره دهید.
- **انتظار اینکه برنامه اندروید به CA کاربر اعتماد کند.** برنامه‌های سطح ⁦API 24⁩ و بالاتر آن را نادیده می‌گیرند، مگر در نسخه debug که آن را مجاز کرده باشد.
- **از قلم انداختن SSL Proxying برای میزبان در Charles.** فقط ورودی‌های رمزنگاری‌شده `CONNECT` را می‌بینید و هیچ محتوایی نمی‌بینید.
- **گوش دادن روی همه رابط‌های شبکه.** در آزمون ما، `mitmdump` بدون `--listen-host` روی `0.0.0.0` و `::` گوش داد؛ مگر اینکه گوشی باید به آن وصل شود، آن را به `127.0.0.1` محدود کنید.
- **اشتراک‌گذاری بی‌احتیاط فایل‌های flow.** این فایل‌ها کوکی‌ها و هدرها را در خود دارند.
- **استفاده از Fiddler Classic در محیط کار پس از اوت 2026.** مجوز آن فقط غیرتجاری است.

## راهنمای انتخاب

| نیاز | پیشنهاد |
|---|---|
| مقایسه درخواست اسکرپر با درخواست مرورگر | mitmproxy با یک افزونه کوچک؛ `verify` در Requests روی فایل CA |
| ویرایش درخواست‌ها در یک پنجره برای QA موبایل | Charles یا Fiddler Everywhere |
| Fiddler برای کار تجاری روی Windows | Fiddler Everywhere یا ابزاری دیگر، نه Fiddler Classic |
| ترافیک HTTPS برنامه اندروید خودتان | `debug-overrides` فقط در نسخه debug |
| آزمودن برنامه از نگاه کاربری در کشوری دیگر | ابزار محلی را به پروکسی موبایل یا مسکونی زنجیر کنید ([تست اپلیکیشن](/fa/app-testing)) |
| یافتن درخواست پس‌زمینه یک صفحه وب | زبانه Network در DevTools؛ ابزار MITM لازم نیست |

## پرسش‌های متداول

### آیا استفاده از پروکسی MITM قانونی است؟

روی دستگاه و برنامه خودتان، یا سیستمی که اجازه کتبی آزمودنش را دارید، ابزاری برای اشکال‌زدایی است. خواندن پنهانی ترافیک دیگران کاری کاملاً متفاوت است. برای اسکرپینگ، نوشته [آیا اسکرپینگ وب قانونی است؟](/fa/blog/is-data-web-scraping-legal) را ببینید.

### آیا mitmproxy امن است؟

ابزار متن‌باز است و به‌صورت محلی اجرا می‌شود. خطر در کلید خصوصی CA در `~/.mitmproxy` است: آن را خصوصی نگه دارید، CA را فقط روی دستگاه‌های آزمایشی نصب کنید و پس از کار حذفش کنید.

### آیا Fiddler Classic هنوز رایگان است و چه تفاوتی با Fiddler Everywhere دارد؟

از 3 اوت 2026، Fiddler Classic فقط برای استفاده غیرتجاری رایگان است؛ روی Windows اجرا می‌شود و دیگر توسعه داده نمی‌شود. Fiddler Everywhere محصول پولی و چندسکویی است که از ⁦HTTP/2⁩ و ⁦TLS 1.3⁩ پشتیبانی می‌کند.

### آیا جایگزین رایگانی برای Charles Proxy وجود دارد؟

mitmproxy متن‌باز است و روی همان پلتفرم‌ها اجرا می‌شود؛ `mitmweb` به آن نمای مرورگر می‌دهد. خود Charles هم دوره آزمایشی 30 روزه دارد.

### گواهی را روی اندروید نصب کرده‌ام، پس چرا ترافیک برنامه‌ام هنوز دیده نمی‌شود؟

برنامه‌هایی که سطح ⁦API 24⁩ یا جدیدتر را هدف می‌گیرند به‌طور پیش‌فرض فقط به CAهای سیستمی اعتماد می‌کنند. در نسخه debug برنامه خودتان با `debug-overrides` به CAهای کاربر اجازه دهید و اگر برنامه گواهی‌ها را پین می‌کند، pinning را در نسخه آزمایشی تنظیم کنید.

### تفاوت پروکسی MITM، پروکسی معمولی و VPN چیست؟

پروکسی معمولی و VPN ترافیک رمزنگاری‌شده را بی‌آنکه بخوانند منتقل می‌کنند و IP خروجی شما را تغییر می‌دهند ([تفاوت پروکسی و VPN](/fa/blog/proxy-vs-vpn)). پروکسی MITM ترافیک را روی رایانه شما باز می‌کند و IP شما را تغییر نمی‌دهد، مگر اینکه به یک پروکسی بالادستی زنجیر شود.

## خلاصه

پروکسی MITM ابزاری برای خواندن ترافیک خودتان است و CA آن محلی و موقت می‌ماند و فقط روی دستگاه‌های آزمایشی نصب می‌شود. Charles و Fiddler Everywhere برای کار در یک پنجره مناسب‌اند و mitmproxy برای اسکریپت‌ها و CI. وقتی آزمون باید از کشوری دیگر انجام شود، ابزار محلی را به یک پروکسی بالادستی زنجیر کنید و از صفحه [تست اپلیکیشن](/fa/app-testing) ما شروع کنید.
