المقارنات

تحدي Cloudflare المُدار مقابل التحدي التفاعلي

تقدم Cloudflare إجراءين للتحدي يمكن لمشغلي الموقع تكوينهما في قواعد WAF: التحدي المُدار و التحدي التفاعلي. التحدي المُدار هو النهج الحديث والتكيفي - تقرر Cloudflare مستوى الصعوبة لكل زائر. التحدي التفاعلي هو الخيار القديم، حيث يقدم دائمًا اختبار CAPTCHA مرئيًا. إن فهم الفرق يحدد طريقة CaptchaAI التي سيتم استخدامها وما يمكن توقعه أثناء التشغيل الآلي.

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

قرار سريع قبل التحليل الكامل

إذا رأيت هذا السلوك فالاحتمال الأكبر ما الذي تفعله أولًا؟
503 مع صفحة تحقق وقد تمر بعض الجلسات دون أداة مرئية Managed Challenge ابدأ بمحاولة turnstile ثم ارجع إلى cloudflare_challenge عند الحاجة
403 وتحديًا مرئيًا في كل مرة تقريبًا Interactive Challenge عالج الصفحة كـ Turnstile مرئي مباشر
جلسات تمر أحيانًا وتتعثر أحيانًا على نفس المسار Managed Challenge متكيف خزّن نوع التحدي لكل جلسة بدل افتراض نمط ثابت

مقارنة سريعة

ميزة التحدي المدار التحدي التفاعلي
مقدمة 2021 الإرث (ما قبل 2021)
** التكيف؟ ** نعم (يقرر Cloudflare لكل زائر) لا (تفاعلي دائمًا)
تمرير غير مرئي ممكن؟ نعم (~ 90% من الزوار يمرون بشكل غير مرئي) لا (يظهر دائمًا اختبار CAPTCHA)
أنواع التحدي المستخدمة التحدي غير المرئي → Turnstile → JS كلمة التحقق (CAPTCHA) مرئية دائمًا
** موصى به بواسطة Cloudflare؟ ** نعم (افتراضي للقواعد الجديدة) لا (تم الاحتفاظ به للتوافق مع الإصدارات السابقة)
** احتكاك المستخدم ** منخفض (معظمهم يمرون دون رؤية أي شيء) عالي (يتطلب التفاعل دائمًا)
حالة HTTP 503 403
طريقة CaptchaAI turnstile أو cloudflare_challenge turnstile

التحدي المدار (حديث)

التحدي المُدار هو إجراء التحدي الموصى به من Cloudflare. ويستخدم إطار عمل القرار لتقديم التحدي الأقل تعطيلًا قدر الإمكان:

تدفق القرار

WAF rule triggers Managed Challenge
    ↓
Cloudflare evaluates visitor signals:
  ├─ Browser fingerprint quality
  ├─ IP reputation score
  ├─ TLS fingerprint (JA3/JA4)
  ├─ Request history
  ├─ Behavioral signals
  └─ Device capabilities
    ↓
Risk assessment → Challenge level selected:
  ├─ LOW risk → Invisible pass (no visible UI)
  ├─ MEDIUM risk → Non-interactive Turnstile (background PoW)
  ├─ HIGH risk → Interactive Turnstile (checkbox/widget)
  └─ VERY HIGH risk → JavaScript challenge page (5s wait)
    ↓
Challenge completed
    ↓
cf_clearance cookie issued

ما تجربة الزوار

نوع الزائر ما يرونه النسبة المئوية
متصفح عادي، IP جيد لا شيء (تمريرة غير مرئية) ~90%
متصفح جديد، IP محايد سبينر مختصر ~5%
إشارات مشبوهة خانة الاختيار Turnstile ~4%
إشارات عالية المخاطر صفحة "جارٍ التحقق من متصفحك...". ~1%

إخراج HTML

تستخدم صفحات التحدي المُدار منصة التحدي الخاصة بـ Cloudflare:

<!-- Managed Challenge page (when visible) -->
<body>
    <div id="challenge-stage">
        <div id="challenge-body-text">
            Verifying you are human. This may take a few seconds.
        </div>

        <!-- Turnstile widget (when rendered) -->
        <div class="cf-turnstile"
             data-sitekey="0x4AAAAAAAC3DHQhMMQ_Rxrg">
        </div>
    </div>

    <!-- Challenge platform script -->
    <script src="/cdn-cgi/challenge-platform/h/g/orchestrate/managed/v1?ray=...">
    </script>
</body>

التحدي التفاعلي (القديمة)

يقدم التحدي التفاعلي دائمًا اختبار CAPTCHA مرئيًا يجب على الزائر التفاعل معه. لا توجد بطاقة مرور غير مرئية - كل زائر يرى التحدي ويجب عليه إكماله.

كيف يعمل

WAF rule triggers Interactive Challenge
    ↓
Full-page CAPTCHA served (HTTP 403)
    ↓
Visitor must interact with CAPTCHA widget
    ↓
CAPTCHA solved
    ↓
cf_clearance cookie issued

ما تجربة الزوار

يرى كل زائر تحديًا بصفحة كاملة باستخدام أداة تشبه Turnstile:

<!-- Interactive Challenge page -->
<body>
    <div id="challenge-running">
        <div class="main-wrapper">
            <h2>Please verify you are human</h2>

            <!-- Always-visible challenge widget -->
            <div class="challenge-widget">
                <!-- Checkbox + verification -->
            </div>
        </div>
    </div>
</body>

لماذا لا يشجعها Cloudflare

قضية تأثير
مرئي دائمًا 100% من الزوار يرون التحدي
** احتكاك أعلى ** يجب على كل زائر التفاعل
** معدل ارتداد أعلى ** يغادر المستخدمون بدلاً من إكماله
** لا يوجد التكيف مع المخاطر ** يتعرض الزوار المعروفون للتحدي أيضًا
مخاوف إمكانية الوصول يجب على كل زائر إكمال التفاعل

الكشف: ما هو التحدي الذي أواجهه؟

import requests
import re

def identify_challenge_type(url):
    """Determine if a URL uses Managed or Interactive Challenge."""
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
                      "AppleWebKit/537.36 Chrome/120.0.0.0",
        "Accept": "text/html,*/*;q=0.8",
        "Accept-Language": "en-US,en;q=0.9",
    }

    response = requests.get(url, headers=headers, timeout=15, allow_redirects=False)
    html = response.text
    status = response.status_code

    result = {
        "url": url,
        "status": status,
        "challenge_type": None,
        "cf_ray": response.headers.get("cf-ray", ""),
        "solve_method": None,
    }

    if status == 200:
        # Check for inline Turnstile widget (not a challenge page)
        if "cf-turnstile" in html:
            result["challenge_type"] = "turnstile_widget"
            result["solve_method"] = "turnstile"
        else:
            result["challenge_type"] = "none"
        return result

    if status == 503:
        # 503 indicates Managed Challenge or IUAM
        if "managed" in html or "challenge-platform" in html:
            result["challenge_type"] = "managed_challenge"
            result["solve_method"] = "turnstile"  # Managed renders as Turnstile
        elif "jschl" in html:
            result["challenge_type"] = "iuam_js_challenge"
            result["solve_method"] = "cloudflare_challenge"
        else:
            result["challenge_type"] = "unknown_503"
        return result

    if status == 403:
        if "challenge" in html.lower():
            result["challenge_type"] = "interactive_challenge"
            result["solve_method"] = "turnstile"
        else:
            result["challenge_type"] = "waf_block"
            result["solve_method"] = None  # Hard block, not solvable
        return result

    return result


# Usage
info = identify_challenge_type("https://protected-site.com/login")
print(f"Challenge: {info['challenge_type']}")
print(f"Solve with: {info['solve_method']}")

جدول الكشف

إشارة التحدي المدار التحدي التفاعلي IUAM كتلة واف
حالة HTTP 503 403 503 403
challenge-platform في HTML
مسار managed في البرنامج النصي
jschl في HTML
يظهر دائما القطعة
تمريرة غير مرئية ممكنة

حل كل نوع من التحدي

حل التحدي المدارة

عادةً ما يتم عرض التحديات المُدارة كعناصر واجهة مستخدم Turnstile. استخدم طريقة CaptchaAI turnstile:

import requests
import time

API_KEY = "YOUR_API_KEY"

def solve_managed_challenge(url, sitekey=None):
    """Solve Cloudflare Managed Challenge."""
    # If sitekey not provided, extract from page
    if not sitekey:
        import re
        headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
                          "AppleWebKit/537.36 Chrome/120.0.0.0",
        }
        page = requests.get(url, headers=headers, timeout=15)
        match = re.search(
            r'data-sitekey=["\']([0-9x][A-Za-z0-9_-]+)["\']', page.text
        )
        sitekey = match.group(1) if match else None

    if not sitekey:
        # No visible Turnstile — try cloudflare_challenge method
        return solve_js_challenge(url)

    submit = requests.post("https://ocr.captchaai.com/in.php", data={
        "key": API_KEY,
        "method": "turnstile",
        "sitekey": sitekey,
        "pageurl": url,
        "json": 1,
    })

    task_id = submit.json()["request"]

    for _ in range(60):
        time.sleep(5)
        result = requests.get("https://ocr.captchaai.com/res.php", params={
            "key": API_KEY,
            "action": "get",
            "id": task_id,
            "json": 1,
        }).json()

        if result.get("status") == 1:
            return result["request"]

    raise TimeoutError("Solve timed out")


def solve_js_challenge(url):
    """Fallback to cloudflare_challenge method."""
    submit = requests.post("https://ocr.captchaai.com/in.php", data={
        "key": API_KEY,
        "method": "cloudflare_challenge",
        "sitekey": "managed",
        "pageurl": url,
        "json": 1,
    })

    task_id = submit.json()["request"]

    for _ in range(60):
        time.sleep(5)
        result = requests.get("https://ocr.captchaai.com/res.php", params={
            "key": API_KEY,
            "action": "get",
            "id": task_id,
            "json": 1,
        }).json()

        if result.get("status") == 1:
            return result["request"]

    raise TimeoutError("Solve timed out")

حل التحدي التفاعلي

يُظهر التحدي التفاعلي دائمًا عنصر واجهة مستخدم مرئيًا. استخدم نفس طريقة turnstile:

def solve_interactive_challenge(url, sitekey):
    """Solve Cloudflare Interactive Challenge (legacy)."""
    submit = requests.post("https://ocr.captchaai.com/in.php", data={
        "key": API_KEY,
        "method": "turnstile",
        "sitekey": sitekey,
        "pageurl": url,
        "json": 1,
    })

    task_id = submit.json()["request"]

    for _ in range(60):
        time.sleep(5)
        result = requests.get("https://ocr.captchaai.com/res.php", params={
            "key": API_KEY,
            "action": "get",
            "id": task_id,
            "json": 1,
        }).json()

        if result.get("status") == 1:
            return result["request"]

    raise TimeoutError("Solve timed out")

Node.js (كلا النوعين)

const axios = require("axios");

const API_KEY = "YOUR_API_KEY";

async function solveCloudflareChallenge(url, type = "managed") {
  const method = type === "js_challenge" ? "cloudflare_challenge" : "turnstile";
  const sitekey =
    type === "js_challenge" ? "managed" : await extractSitekey(url);

  const submit = await axios.post("https://ocr.captchaai.com/in.php", null, {
    params: {
      key: API_KEY,
      method,
      sitekey: sitekey || "managed",
      pageurl: url,
      json: 1,
    },
  });

  const taskId = submit.data.request;

  for (let i = 0; i < 60; i++) {
    await new Promise((r) => setTimeout(r, 5000));

    const result = await axios.get("https://ocr.captchaai.com/res.php", {
      params: { key: API_KEY, action: "get", id: taskId, json: 1 },
    });

    if (result.data.status === 1) {
      return result.data.request;
    }
  }

  throw new Error("Solve timed out");
}

async function extractSitekey(url) {
  try {
    const response = await axios.get(url, {
      headers: { "User-Agent": "Mozilla/5.0 Chrome/120.0.0.0" },
      validateStatus: () => true,
    });
    const match = response.data.match(
      /data-sitekey=["']([0-9x][A-Za-z0-9_-]+)["']/
    );
    return match ? match[1] : null;
  } catch {
    return null;
  }
}

الهجرة من التفاعلية إلى المدارة

توصي Cloudflare بالانتقال من التحدي التفاعلي إلى التحدي المُدار. إذا كان الموقع الذي تقوم بتشغيله تلقائيًا يقوم بالتبديل:

التغيير التأثير على الأتمتة
التفاعلية → المدارة قد يبدأ بالمرور بشكل غير مرئي (احتمال 90% تقريبًا)
HTTP 403 → 503 تحديث عمليات التحقق من رمز الحالة
→ مرئي دائمًا قد لا تكون القطعة في HTML
نفس مفتاح الموقع يبقى رمز الحل CaptchaAI كما هو
نفس إخراج cf_clearance يبقى التعامل مع ملفات تعريف الارتباط كما هو

استكشاف الأخطاء وإصلاحها

أعراض السبب إصلاح
503 مع عدم وجود القطعة المرئية لقد مر التحدي المُدار بشكل غير مرئي لا يلزم اتخاذ أي إجراء، لقد نجحت
503 مع "التحقق من المتصفح الخاص بك" تمكنت من الارتقاء إلى مستوى تحدي JS استخدم طريقة cloudflare_challenge
403 مع اختبار CAPTCHA المرئي التحدي التفاعلي (القديمة) استخدم طريقة turnstile
403 بدون تحدي كتلة WAF، وليس تحديا تغيير IP أو نمط الطلب
يتغير نوع التحدي بشكل عشوائي التحدي المُدار يتكيّف مع الإشارات التعامل مع كل من تحدي Turnstile وJS
cf_clearance من نوع واحد مرفوض لنوع آخر تدفقات التحدي المختلفة، نفس المجال حل أي تحدي يتم تقديمه

الأسئلة المتداولة

هل ينبغي علي دائمًا تجربة التحدي المُدار أولاً؟

نعم. تستخدم معظم المواقع "التحدي المُدار" الآن. ابدأ باستخدام طريقة turnstile، ثم ارجع إلى cloudflare_challenge إذا كانت الصفحة تعرض تحدي JavaScript (503 مع "التحقق من المتصفح").

هل يمكن لموقع ما استخدام كلا النوعين في صفحات مختلفة؟

نعم، ولكن هذا غير شائع. يمكن أن يكون لكل قاعدة WAF إجراء مختلف. قد تستخدم إحدى القواعد التحدي المُدار لـ /login والتحدي التفاعلي لـ /api/.

هل لا يزال التحدي المُدار بحاجة إلى ملف تعريف الارتباط cf_clearance؟

نعم. ينتج كلا النوعين من التحدي نفس ملف تعريف الارتباط cf_clearance. التعامل مع ملفات تعريف الارتباط متطابق بغض النظر عن نوع التحدي.

ماذا لو تجاوزني التحدي المُدار بشكل غير مرئي؟

إذا قرر التحدي المُدار أن طلبك منخفض المخاطر، فإنه يمرر الطلب دون أي اعتراض واضح. سيكون ردك 200 عادي مع محتوى الصفحة. ليست هناك حاجة إلى حل CaptchaAI في هذه الحالة.

هل تم إهمال التحدي التفاعلي؟

لم تقم Cloudflare بإهمالها رسميًا، لكنهم يوصون بالتحدي المُدار لجميع القواعد الجديدة. يبقى التحدي التفاعلي للتوافق مع الإصدارات السابقة. قد يتم ترحيل المواقع في أي وقت.


ملخص

يختار التحدي المُدار من Cloudflare بشكل تكيفي صعوبة التحدي لكل زائر (غير مرئي لتحدي JS الكامل)، بينما يقدم التحدي التفاعلي دائمًا اختبار CAPTCHA مرئيًا. كلاهما ينتج نفس ملف تعريف الارتباط cf_clearance ويتم حلهما باستخدام CaptchaAI. استخدم turnstile لمعظم التحديات وcloudflare_challenge لصفحات تحدي JavaScript. التحدي المُدار هو الوضع الافتراضي الحديث؛ التحدي التفاعلي هو إرث.

مقالات ذات صلة

أدلة ذات صلة

التعليقات غير مفعّلة لهذا المقال.