«Режим атаки» (IUAM) от Cloudflare — это защита от DDoS, которая заставляет каждого посетителя выполнить 5-секундный вызов JavaScript, прежде чем получить доступ к сайту. Это самый агрессивный режим защиты Cloudflare, который запускается вручную операторами сайтов во время атак или включается постоянно на сайтах с высоким уровнем риска. Для автоматического доступа IUAM создает обязательный вызов JavaScript, который не могут пройти традиционные HTTP-клиенты.
Чем занимается МУАМ
Когда оператор сайта включает «Режим атаки» на панели управления Cloudflare:
Every request → Cloudflare edge
↓
JavaScript challenge page served (HTTP 503)
↓
Browser executes JavaScript challenge (~5 seconds)
↓
Challenge answer submitted automatically
↓
qa_validation_cookie cookie set
↓
Original page loaded with qa_validation_cookie cookie
Страница вызова IUAM
Страница вызова возвращает HTTP 503 и содержит:
| Элемент | Цель |
|---|---|
jschl_vc |
Вызов кода подтверждения |
pass |
Токен времени (обеспечивает 5-секундное ожидание) |
jschl_answer |
Ответ, рассчитанный с помощью JavaScript |
cf_chl_opt |
Варианты испытаний |
ray |
Идентификатор Cloudflare Ray для запроса |
| «Проверка браузера перед доступом к...» | Видимое сообщение для пользователей |
Ключевые характеристики
- Код состояния HTTP 503 (НЕ 403)
- Обязательное 5-секундное ожидание перед отправкой запроса
- Требуется выполнение JavaScript — обычные HTTP-клиенты не работают.
- qa_validation_cookie cookie — действителен в течение ~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-защиты в staging (generic)"
if status == 200:
return "No challenge (passed)"
return f"Unknown (status: {status})"
Таблица обнаружения
| Сигнал | МУАМ | Управляемый вызов | Cloudflare Turnstile | Блок WAF |
|---|---|---|---|---|
| HTTP-статус | 503 | 503 | 200 | 403 |
jschl в теле |
✅ | ❌ | ❌ | ❌ |
| 5 секунд ожидания | ✅ | Иногда | ❌ | ❌ |
Набор qa_validation_cookie |
После решения | После решения | ❌ | ❌ |
| Страница испытания | Полная страница | Полная страница | Только виджет | Страница ошибки |
| Требуется JS | ✅ | ✅ | ✅ | ❌ |
Как работает вызов JavaScript
Задача JavaScript IUAM предназначена для проверки того, что у посетителя настоящий браузер:
Ход испытаний
- Cloudflare предоставляет страницу вызова с запутанным JavaScript
- JavaScript выполняет вычисления: - Математические операции над строками со страницы - измерения DOM - Контроль времени (минимум 4-5 секунд)
- Ответ рассчитан — числовое значение, основанное на задаче.
- Форма отправляется автоматически в Cloudflare с помощью
jschl_vc,passиjschl_answer. - Cloudflare проверяет ответ и время
- Возвращен файл cookie
qa_validation_cookie— доступ разрешен примерно на 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
Метод 1: решатель страница Cloudflare-защиты в staging (рекомендуется)
Метод turnstile 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": "turnstile",
"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 qa_validation_cookie cookie or token
# The response contains the clearance data needed to access the site
Способ 2. Автоматизация браузера с помощью CaptchaAI.
Для постоянных сеансов объедините headless-браузер с 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()
qa_validation_cookie = next(
(c["value"] for c in cookies if c["name"] == "qa_validation_cookie"), None
)
if qa_validation_cookie:
print(f"qa_validation_cookie obtained: {qa_validation_cookie[: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: "turnstile",
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)));
Управление файлами cookie qa_validation_cookie
Файл cookie qa_validation_cookie является ключевым результатом решения задачи IUAM:
| Свойство | Ценить |
|---|---|
| Название файла cookie | qa_validation_cookie |
| Продолжительность жизни | ~30 минут (настраивается на месте) |
| Объем | Весь домен |
| Привязан к | IP-адрес + Пользовательский агент |
| Многоразовый | Да, на всю жизнь |
| Передаваемый | Только с тем же IP + UA |
Стратегия управления файлами cookie
import requests
import time
class IUAMSessionManager:
"""Manage qa_validation_cookie 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": "turnstile",
"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-адрес для решения + доступ |
| qa_validation_cookie отклонен | Несоответствие пользовательского агента | Используйте один и тот же пользовательский агент для решения и запросов. |
| 503 сохраняется после решения | Срок действия файла cookie истек (>30 минут) | Обновить разрешение до истечения срока действия |
| Страница испытания отличается от ожидаемой | Сайт использует управляемый вызов, а не IUAM | Переключиться на метод решения Cloudflare Turnstile |
| Несколько страниц испытаний | Первая задача — IUAM, вторая — Cloudflare Turnstile. | Решите оба последовательно |
Часто задаваемые вопросы
Как долго действует qa_validation_cookie?
Значение по умолчанию — 30 минут, но операторы объекта могут настроить его от 15 минут до 24 часов. Большинство сайтов используют 30-минутное значение по умолчанию. Запланируйте обновление до истечения срока действия.
Могу ли я разделить qa_validation_cookie между запросами?
Да, но только с того же IP-адреса и с той же строкой User-Agent. Изменение любого из них приведет к аннулированию файла cookie.
Всегда ли включен режим «Под атакой»?
Нет. Операторы сайта переключают его вручную во время атак. Некоторые сайты оставляют его включенным постоянно в качестве дополнительного уровня безопасности. Невозможно предсказать, будет ли на сайте активен IUAM.
В чем разница между IUAM и управляемым вызовом?
IUAM безоговорочно бросает вызов каждому посетителю. Управляемые вызовы используют оценку ботов Cloudflare для выборочной проверки подозрительного трафика. IUAM всегда возвращает 503 при вызове JS. Управляемые испытания могут вместо этого возвращать 503 с виджетом «Cloudflare Turnstile».
Влияет ли IUAM на конечные точки API?
Да. IUAM применяется к каждому запросу в домене, включая конечные точки API. Вот почему запросы API от клиентов, не являющихся браузерами, терпят неудачу — они не могут выполнить вызов JavaScript.
Краткое содержание
Режим «Под атакой» Cloudflare создает обязательный вызов JavaScript для всех посетителей, возвращая HTTP 503 с требованием 5-секундных вычислений. Решайте проблемы IUAM с помощьюРешатель страница Cloudflare-защиты в staging от CaptchaAI, затем используйте файл cookie qa_validation_cookie для последующих запросов в течение 30 минут. Всегда сопоставляйте IP-адрес и пользовательский агент при решении и использовании.
Похожие статьи
- страница Cloudflare-защиты в staging против обнаружения Cloudflare Turnstile
- Как работает страница Cloudflare-защиты в staging
- страница Cloudflare-защиты в staging Пошаговое руководство по сеансу