← Документация WAF / detections / ai-security-for-apps
Примеры правил блокировки
Возврат пользовательской ошибки, когда пользователь спрашивает о насилии или разжигании ненависти
Чат-бот поддержки не должен реагировать на промпты о насильственных преступлениях или языке вражды. Этот пользовательское правило блокирует запрос и возвращает JSON-ответ, который ваше приложение может разобрать и показать пользователю.
-
Когда входящие запросы соответствуют:
Поле Оператор Значение Категории LLM Unsafe topic is in S1: Violent CrimesS10: HateВыражение при использовании редактора:
(any(cf.llm.prompt.unsafe_topic_categories[*] in {"S1" "S10"})) -
Действие: Block
-
With response type: Custom JSON
-
Тело ответа:
{ "error": "content_policy", "message": "Your message could not be processed because it touches on a topic outside this assistant's scope. Please rephrase your question." }
Ваше приложение может проверять ответ, отличный от 200, и отображать message (поле) пользователю, сохраняя диалоговый формат вместо показа сырой страницы блокировки.
Блокировка попыток инъекции промптов из автоматизированных источников за пределами вашей страны
Это правило сочетает возможности AI Security for Apps: оценка инъекции с Bot Management и страну запроса, чтобы сфокусироваться на атаках из автоматизированных источников с высокой степенью уверенности. Такой многоуровневый подход значительно снижает число ложных срабатываний по сравнению с использованием любого одиночного сигнала.
-
Когда входящие запросы соответствуют:
Введите в редакторе следующее выражение:
(cf.llm.prompt.injection_score lt 25 and cf.bot_management.score lt 10 and ip.geoip.country ne "US") -
Действие: Block
Правило нацелено на запросы, которые одновременно:
- Вероятные попытки инъекции промпта (оценка ниже 25).
- Исходит от автоматизированных инструментов, а не от настоящего браузера (оценка бота ниже 10).
- Приходящий не из США — скорректируйте код страны в соответствии с тем, где находятся ваши пользователи.
Любой отдельный сигнал сам по себе может давать ложные срабатывания. Вместе же они выявляют паттерн, устойчиво связанный с автоматизированными атаками prompt injection.
Разрешение финансовых PII только из вашей внутренней сети
Приложение финансовых услуг легитимно обрабатывает номера банковских карт и счетов от внутренних агентов, но должно блокировать эти типы PII от внешних пользователей. Это правило использует номер автономной системы (ASN) , чтобы отличать внутренний трафик от публичного.
-
Когда входящие запросы соответствуют:
Введите в редакторе следующее выражение:
(any(cf.llm.prompt.pii_categories[*] in {"CREDIT_CARD" "BANK_ACCOUNT"}) and ip.src.asnum ne 13335)Замените
13335с ASN вашей организации. -
Действие: Block
-
With response type: Custom JSON
-
Тело ответа:
{ "error": "pii_blocked", "message": "Financial account information cannot be submitted from external networks. If you are an internal agent, connect to the corporate network and try again." }
Внутренние агенты в вашей корпоративной сети (определяемые по ASN) могут передавать финансовые PII AI-ассистенту в рамках рабочего процесса, тогда как внешние пользователи блокируются. Это можно уточнить, скомбинировав с Access сервисные токены или mTLS для более строгой проверки личности.
Обработка ответов блокировки в вашем приложении
Когда правило WAF блокирует запрос, Cloudflare отправляет ответ блокировки вашему приложению, а не конечному пользователю. Ваше приложение должно обработать этот ответ и решить, что показать. Без обработки ошибок пользователи могут увидеть сырую HTML-страницу ошибки или сломанный интерфейс.
Вот два действия, которые помогут сохранить комфортную работу.
Задайте резервное сообщение
Определите понятное сообщение по умолчанию, которое ваше приложение показывает при получении неуспешного ответа. Это работает независимо от того, как настроено правило блокировки, — включая стандартную страницу блокировки Cloudflare, которая возвращает HTML и иначе сломала бы чат-интерфейс на основе JSON.
// Define a user-friendly fallback message. This is what the user will see
// any time the request is blocked or something unexpected happens.
const FALLBACK = "Sorry, I can't process that request. Please try rephrasing.";
const resp = await fetch("/api/chat", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ prompt: userMessage }),
});
// If the response is not 2xx, show the fallback instead of trying to parse
// the body. This safely handles the default Cloudflare block page (which is
// HTML) without breaking your UI.
if (!resp.ok) {
await resp.text(); // consume the body so the connection is released
showError(FALLBACK);
return;
}
const data = await resp.json();
showMessage(data.message);Показ пользовательских сообщений об ошибках из WAF
Для большего контроля настройте блокирующие правила с пользовательский JSON-ответ — например, { "message": "That question is outside this assistant's scope." }. Ваше приложение затем может разобрать ответ и показать пользовательское сообщение, когда оно доступно, и сообщение по умолчанию — когда его нет.
const FALLBACK = "Sorry, I can't process that request. Please try rephrasing.";
const resp = await fetch("/api/chat", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ prompt: userMessage }),
});
if (!resp.ok) {
// Check the content type to determine if the response contains a custom
// JSON error from your WAF rule, or something else (like the default
// Cloudflare HTML block page, or a DDoS / Bot Management challenge).
const ct = (resp.headers.get("content-type") || "").toLowerCase();
if (ct.includes("application/json")) {
// The WAF returned your custom JSON response. Parse it and show the
// message you configured in the rule. Fall back to the default if the
// field is missing or empty.
const data = await resp.json();
showError(data.message || FALLBACK);
} else {
// The response is not JSON — most likely the default Cloudflare HTML
// block page. Discard the body and show the friendly fallback.
await resp.text();
showError(FALLBACK);
}
return;
}
const data = await resp.json();
showMessage(data.message);