INTEGRITY Документация

Примеры правил блокировки

Возврат пользовательской ошибки, когда пользователь спрашивает о насилии или разжигании ненависти

Чат-бот поддержки не должен реагировать на промпты о насильственных преступлениях или языке вражды. Этот пользовательское правило блокирует запрос и возвращает JSON-ответ, который ваше приложение может разобрать и показать пользователю.

Ваше приложение может проверять ответ, отличный от 200, и отображать message (поле) пользователю, сохраняя диалоговый формат вместо показа сырой страницы блокировки.

Блокировка попыток инъекции промптов из автоматизированных источников за пределами вашей страны

Это правило сочетает возможности AI Security for Apps: оценка инъекции с Bot Management и страну запроса, чтобы сфокусироваться на атаках из автоматизированных источников с высокой степенью уверенности. Такой многоуровневый подход значительно снижает число ложных срабатываний по сравнению с использованием любого одиночного сигнала.

Правило нацелено на запросы, которые одновременно:

  1. Вероятные попытки инъекции промпта (оценка ниже 25).
  2. Исходит от автоматизированных инструментов, а не от настоящего браузера (оценка бота ниже 10).
  3. Приходящий не из США — скорректируйте код страны в соответствии с тем, где находятся ваши пользователи.

Любой отдельный сигнал сам по себе может давать ложные срабатывания. Вместе же они выявляют паттерн, устойчиво связанный с автоматизированными атаками prompt injection.

Разрешение финансовых PII только из вашей внутренней сети

Приложение финансовых услуг легитимно обрабатывает номера банковских карт и счетов от внутренних агентов, но должно блокировать эти типы PII от внешних пользователей. Это правило использует номер автономной системы (ASN) , чтобы отличать внутренний трафик от публичного.

Внутренние агенты в вашей корпоративной сети (определяемые по 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);