"أنا تحت وضع الهجوم" (IUAM) الخاص بـ Cloudflare هو دفاع DDoS يفرض على كل زائر اجتياز تحدي JavaScript مدته 5 ثوانٍ قبل الوصول إلى الموقع. إنه وضع حماية Cloudflare الأكثر عدوانية، والذي يتم تشغيله يدويًا بواسطة مشغلي الموقع أثناء الهجمات أو يتم تمكينه بشكل دائم على المواقع عالية المخاطر. للوصول الآلي، يقوم IUAM بإنشاء اختبار JavaScript إلزامي لا يمكن لعملاء HTTP التقليديين اجتيازه.
ما يفعله IUAM
عندما يقوم مشغل الموقع بتمكين "أنا تحت وضع الهجوم" في لوحة تحكم Cloudflare:
Every request → Cloudflare edge
↓
JavaScript challenge page served (HTTP 503)
↓
Browser executes JavaScript challenge (~5 seconds)
↓
Challenge answer submitted automatically
↓
cf_clearance cookie set
↓
Original page loaded with cf_clearance cookie
صفحة التحدي IUAM
تعرض صفحة التحدي HTTP 503 وتحتوي على:
| العنصر | الغرض |
|---|---|
jschl_vc |
رمز التحقق التحدي |
pass |
رمز التوقيت (يفرض الانتظار لمدة 5 ثوانٍ) |
jschl_answer |
إجابة JavaScript المحسوبة |
cf_chl_opt |
خيارات التحدي |
ray |
معرف Cloudflare راي للطلب |
| "يتم التحقق من المتصفح الخاص بك قبل الوصول إلى..." | رسالة مرئية للمستخدمين |
الخصائص الرئيسية
- HTTP 503 رمز الحالة (وليس 403)
- الانتظار الإلزامي لمدة 5 ثوانٍ قبل إرسال التحدي
- مطلوب تنفيذ JavaScript — يفشل عملاء HTTP العاديون
- ملف تعريف الارتباط cf_clearance — صالح لمدة 30 دقيقة تقريبًا، ويسمح بالطلبات اللاحقة
- على مستوى النطاق — تعرض كل صفحة على النطاق التحدي
تحديد IUAM مقابل وسائل حماية Cloudflare الأخرى
import requests
def identify_cloudflare_protection(url):
"""Distinguish IUAM from other Cloudflare protections."""
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 Chrome/120.0.0.0",
}
response = requests.get(url, headers=headers, timeout=15, allow_redirects=False)
html = response.text
status = response.status_code
if status == 503 and "jschl" in html:
return "IUAM (I'm Under Attack Mode)"
if status == 503 and "challenge-platform" in html:
return "Managed Challenge"
if status == 403 and "cf-ray" in str(response.headers):
return "Blocked by WAF/Bot Management"
if "cf-turnstile" in html:
return "Turnstile widget"
if "challenges.cloudflare.com" in html:
return "Cloudflare challenge (generic)"
if status == 200:
return "No challenge (passed)"
return f"Unknown (status: {status})"
جدول الكشف
| إشارة | IUAM | التحدي المدار | Turnstile | كتلة واف |
|---|---|---|---|---|
| حالة HTTP | 503 | 503 | 200 | 403 |
jschl في الجسم |
✅ | ❌ | ❌ | ❌ |
| انتظر 5 ثواني | ✅ | في بعض الأحيان | ❌ | ❌ |
** مجموعة cf_clearance ** |
بعد الحل | بعد الحل | ❌ | ❌ |
| صفحة التحدي | صفحة كاملة | صفحة كاملة | القطعة فقط | صفحة الخطأ |
| يتطلب JS | ✅ | ✅ | ✅ | ❌ |
كيف يعمل تحدي JavaScript
تم تصميم تحدي JavaScript الخاص بـ IUAM للتحقق من أن الزائر لديه متصفح حقيقي:
تدفق التحدي
- يقدم Cloudflare صفحة التحدي باستخدام JavaScript المبهم
- ** تقوم JavaScript بإجراء العمليات الحسابية:** - العمليات الرياضية على سلاسل من الصفحة - قياسات DOM - تطبيق التوقيت (الحد الأدنى 4-5 ثواني)
- الإجابة المحسوبة — قيمة عددية تعتمد على التحدي
- تم إرسال النموذج تلقائيًا إلى Cloudflare باستخدام
jschl_vcوpassوjschl_answer - ** يقوم Cloudflare بالتحقق من صحة ** الإجابة والتوقيت
- ** تم إرجاع ملف تعريف الارتباط
cf_clearance** - يسمح بالوصول لمدة 30 دقيقة تقريبًا
لماذا يفشل عملاء HTTP؟
# This will ALWAYS get the challenge page:
import requests
response = requests.get("https://iuam-protected-site.com")
# response.status_code == 503
# response.text contains "Checking your browser..."
# Plain HTTP clients cannot:
# - Execute JavaScript
# - Compute the challenge answer
# - Meet the timing requirement
# - Generate the required cookies
حل IUAM باستخدام CaptchaAI
الطريقة الأولى: حل Cloudflare Challenge (مستحسن)
تتعامل طريقة cloudflare_challenge الخاصة بـ CaptchaAI مع تحديات IUAM مباشرة:
import requests
import time
API_KEY = "YOUR_API_KEY"
TARGET_URL = "https://iuam-protected-site.com/data"
# Step 1: Submit challenge to CaptchaAI
submit = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "cloudflare_challenge",
"sitekey": "managed",
"pageurl": TARGET_URL,
"json": 1,
})
task_id = submit.json()["request"]
print(f"Task submitted: {task_id}")
# Step 2: Poll for result
for attempt 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:
token = result["request"]
print(f"Challenge solved! Token: {token[:50]}...")
break
elif result.get("request") == "ERROR_CAPTCHA_UNSOLVABLE":
print("Challenge could not be solved")
break
else:
print("Timed out waiting for solution")
# Step 3: Use cf_clearance cookie or token
# The response contains the clearance data needed to access the site
الطريقة الثانية: أتمتة المتصفح باستخدام CaptchaAI
للجلسات المستمرة، قم بدمج متصفح بدون رأس مع CaptchaAI:
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import requests
import time
API_KEY = "YOUR_API_KEY"
# Launch browser
options = webdriver.ChromeOptions()
options.add_argument("--disable-blink-features=AutomationControlled")
driver = webdriver.Chrome(options=options)
# Navigate to IUAM page
driver.get("https://iuam-protected-site.com")
# Wait for challenge page to load
time.sleep(3)
# Check if IUAM challenge is present
if "Checking your browser" in driver.page_source or driver.title == "Just a moment...":
print("IUAM challenge detected")
# Option A: Wait for browser to solve natively (if not headless)
try:
WebDriverWait(driver, 15).until(
lambda d: "Checking your browser" not in d.page_source
)
print("Challenge passed natively")
except:
print("Native solve failed — using CaptchaAI")
# Submit to CaptchaAI for solving
# Token submission via JavaScript injection
# After challenge is passed, extract cookies for API use
cookies = driver.get_cookies()
cf_clearance = next(
(c["value"] for c in cookies if c["name"] == "cf_clearance"), None
)
if cf_clearance:
print(f"cf_clearance obtained: {cf_clearance[:30]}...")
# Use cookie with requests library
session = requests.Session()
for cookie in cookies:
session.cookies.set(cookie["name"], cookie["value"])
session.headers.update({
"User-Agent": driver.execute_script("return navigator.userAgent"),
})
# Now make requests with the clearance cookie
response = session.get("https://iuam-protected-site.com/api/data")
print(f"Status: {response.status_code}")
driver.quit()
Node.js
const axios = require("axios");
const API_KEY = "YOUR_API_KEY";
const TARGET_URL = "https://iuam-protected-site.com/data";
async function solveIUAM() {
// Submit challenge
const submit = await axios.post("https://ocr.captchaai.com/in.php", null, {
params: {
key: API_KEY,
method: "cloudflare_challenge",
sitekey: "managed",
pageurl: TARGET_URL,
json: 1,
},
});
const taskId = submit.data.request;
console.log(`Task submitted: ${taskId}`);
// Poll for result
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) {
console.log("IUAM challenge solved!");
return result.data.request;
}
}
throw new Error("Timed out");
}
solveIUAM().then((token) => console.log("Token:", token.substring(0, 50)));
إدارة ملفات تعريف الارتباط cf_clearance
يعد ملف تعريف الارتباط cf_clearance هو الناتج الرئيسي لحل تحدي IUAM:
| الملكية | القيمة |
|---|---|
| اسم ملف تعريف الارتباط | cf_clearance |
| ** مدى الحياة ** | ~ 30 دقيقة (قابل للتكوين في الموقع) |
| النطاق | على مستوى المجال |
| مرتبطة | عنوان IP + وكيل المستخدم |
| ** قابلة لإعادة الاستخدام ** | نعم مدى الحياة |
| قابل للتحويل | فقط مع نفس IP + UA |
استراتيجية إدارة ملفات تعريف الارتباط
import requests
import time
class IUAMSessionManager:
"""Manage cf_clearance cookies for IUAM-protected sites."""
def __init__(self, api_key, target_url, user_agent=None):
self.api_key = api_key
self.target_url = target_url
self.user_agent = user_agent or (
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 Chrome/120.0.0.0"
)
self.session = requests.Session()
self.session.headers["User-Agent"] = self.user_agent
self.clearance_time = 0
self.clearance_lifetime = 1800 # 30 minutes default
def needs_refresh(self):
"""Check if clearance cookie needs refreshing."""
return time.time() - self.clearance_time > self.clearance_lifetime - 60
def solve_challenge(self):
"""Solve IUAM challenge and update session cookies."""
submit = requests.post("https://ocr.captchaai.com/in.php", data={
"key": self.api_key,
"method": "cloudflare_challenge",
"sitekey": "managed",
"pageurl": self.target_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": self.api_key,
"action": "get",
"id": task_id,
"json": 1,
}).json()
if result.get("status") == 1:
# Apply clearance to session
self.clearance_time = time.time()
return result["request"]
raise TimeoutError("IUAM solve timed out")
def get(self, url, **kwargs):
"""Make a GET request, solving IUAM if needed."""
if self.needs_refresh():
self.solve_challenge()
return self.session.get(url, **kwargs)
استكشاف الأخطاء وإصلاحها
| أعراض | السبب | إصلاح |
|---|---|---|
| حلقات التحدي لا نهاية لها | تم تغيير IP بعد الحصول على التصريح | استخدم عنوان IP ثابتًا للحل + الوصول |
| تم رفض cf_clearance | عدم تطابق وكيل المستخدم | استخدم نفس وكيل المستخدم للحل والطلبات |
| 503 يستمر بعد الحل | انتهت صلاحية ملف تعريف الارتباط (> 30 دقيقة) | تحديث التخليص قبل انتهاء الصلاحية |
| صفحة التحدي مختلفة عن المتوقع | يستخدم الموقع "التحدي المُدار"، وليس IUAM | قم بالتبديل إلى طريقة حل Turnstile |
| صفحات التحدي المتعددة | التحدي الأول هو IUAM، والثاني هو Turnstile | حل كلاهما بالتسلسل |
الأسئلة المتداولة
كم من الوقت يستمر cf_clearance؟
الافتراضي هو 30 دقيقة، ولكن يمكن لمشغلي الموقع تكوينه من 15 دقيقة إلى 24 ساعة. تستخدم معظم المواقع الإعداد الافتراضي وهو 30 دقيقة. خطط للتحديث قبل انتهاء الصلاحية.
هل يمكنني مشاركة cf_clearance بين الطلبات؟
نعم، ولكن فقط من نفس عنوان IP وبنفس سلسلة وكيل المستخدم. سيؤدي تغيير أي منهما إلى إبطال ملف تعريف الارتباط.
هل يتم تمكين وضع "تحت الهجوم" دائمًا؟
لا، يقوم مشغلو الموقع بتبديله يدويًا أثناء الهجمات. تتركه بعض المواقع ممكّنًا بشكل دائم كطبقة أمان إضافية. لا توجد طريقة للتنبؤ بما إذا كان الموقع سيكون به IUAM نشطًا أم لا.
ما الفرق بين IUAM والتحدي المُدار؟
IUAM تتحدى كل زائر دون قيد أو شرط. تستخدم التحديات المُدارة تقييم الروبوت الخاص بـ Cloudflare لتحدي حركة المرور المشبوهة بشكل انتقائي. تقوم IUAM دائمًا بإرجاع 503 مع تحدي JS. قد تقوم التحديات المُدارة بإرجاع 503 باستخدام عنصر واجهة مستخدم Turnstile بدلاً من ذلك.
هل يؤثر IUAM على نقاط نهاية API؟
نعم. ينطبق IUAM على كل طلب في المجال، بما في ذلك نقاط نهاية API. وهذا هو سبب فشل طلبات واجهة برمجة التطبيقات (API) من العملاء الذين لا يستخدمون المتصفح - حيث لا يمكنهم تنفيذ تحدي JavaScript.
ملخص
يقوم وضع الهجوم في Cloudflare بإنشاء تحدي JavaScript إلزامي لجميع الزوار، مما يؤدي إلى إعادة HTTP 503 مع متطلبات حسابية مدتها 5 ثوانٍ. حل تحديات IUAM معCaptchaAI Cloudflare Challenge ، ثم استخدم ملف تعريف الارتباط cf_clearance للطلبات اللاحقة خلال نافذة مدتها 30 دقيقة. قم دائمًا بمطابقة عنوان IP ووكيل المستخدم بين الحل والاستخدام.
مقالات ذات صلة
- Cloudflare Challenge مقابل اكتشاف Turnstile
- كيف يعمل Cloudflare Challenge
- Cloudflare Challenge تجول تدفق الجلسة