← Dokumentace WAF / detections / ai-security-for-apps
Příklady mitigačních pravidel
Vrácení vlastní chyby, když se uživatel ptá na násilný nebo nenávistný obsah
Chatbot zákaznické podpory by neměl reagovat na prompty o násilných trestných činech nebo nenávistných projevech. Tento vlastní pravidlo požadavek zablokuje a vrátí JSON odpověď, kterou vaše aplikace může zparsovat a zobrazit uživateli.
-
When incoming requests match:
Pole Operátor Hodnota LLM Unsafe topic categories is in S1: Violent CrimesS10: HateVýraz při použití editoru:
(any(cf.llm.prompt.unsafe_topic_categories[*] in {"S1" "S10"})) -
Akce: Block
-
S typem odpovědi: Custom JSON
-
Tělo odpovědi:
{ "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." }
Vaše aplikace může kontrolovat odpověď jinou než 200 a zobrazit message uživateli, čímž zachováte konverzační charakter místo zobrazení strohé blokovací stránky.
Blokování pokusů o prompt injection z automatizovaných zdrojů mimo vaši zemi
Toto pravidlo kombinuje pole AI Security for Apps injection score s Bot Management a zemí požadavku, abyste se zaměřili na útoky z automatizovaných zdrojů s vysokou mírou jistoty. Tento vrstvený přístup výrazně snižuje počet falešně pozitivních detekcí oproti použití jediného signálu.
-
When incoming requests match:
Do editoru zadejte následující výraz:
(cf.llm.prompt.injection_score lt 25 and cf.bot_management.score lt 10 and ip.geoip.country ne "US") -
Akce: Block
Pravidlo cílí na požadavky, které jsou současně:
- Pravděpodobné pokusy o prompt injection (skóre pod 25).
- Pochází z automatizovaných nástrojů, nikoli ze skutečného prohlížeče (bot skóre pod 10).
- Pocházející mimo USA — upravte kód země podle toho, kde jsou vaši uživatelé.
Každý jednotlivý signál může sám o sobě vytvářet falešně pozitivní výsledky. Dohromady však identifikují vzorec silně spojený s automatizovanými prompt injection útoky.
Povolení finančních PII pouze z vaší interní sítě
Aplikace finančních služeb legitimně zpracovává čísla platebních karet a bankovních účtů od interních pracovníků, ale u externích uživatelů by tyto typy PII měla blokovat. Toto pravidlo používá číslo autonomního systému (ASN) k odlišení interního provozu od veřejného.
-
When incoming requests match:
Do editoru zadejte následující výraz:
(any(cf.llm.prompt.pii_categories[*] in {"CREDIT_CARD" "BANK_ACCOUNT"}) and ip.src.asnum ne 13335)Nahraďte
13335hodnotou ASN vaší organizace. -
Akce: Block
-
S typem odpovědi: Custom JSON
-
Tělo odpovědi:
{ "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." }
Interní agenti ve vaší firemní síti (identifikovaní podle ASN) mohou v rámci svého workflow odesílat finanční PII AI asistentovi, zatímco externí uživatelé jsou blokováni. Dále to můžete zpřesnit kombinací s Access service tokeny nebo mTLS pro silnější ověření identity.
Zpracování blokovacích odpovědí ve vaší aplikaci
Když pravidlo WAF zablokuje požadavek, Cloudflare odešle blokovací odpověď zpět vaší aplikaci — nikoli koncovému uživateli. Vaše aplikace musí tuto odpověď zpracovat a rozhodnout, co zobrazit. Bez ošetření chyb mohou vaši uživatelé vidět surovou HTML chybovou stránku nebo rozbité UI.
Zde jsou dvě věci, které můžete udělat pro hladký průběh.
Nastavení záložní zprávy
Definujte přívětivou výchozí zprávu, kterou vaše aplikace zobrazí, kdykoli obdrží neúspěšnou odpověď. Funguje to bez ohledu na to, jak je blokovací pravidlo nakonfigurováno — včetně výchozí blokovací stránky Cloudflare, která vrací HTML, jež by jinak rozbilo chatovací UI založené na 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);Zobrazení vlastních chybových zpráv z WAF
Pro větší kontrolu nakonfigurujte svá bloková pravidla s vlastní JSON odpověď — například { "message": "That question is outside this assistant's scope." }. Vaše aplikace pak může odpověď zparsovat a zobrazit vlastní zprávu, pokud je k dispozici, jinak použít výchozí.
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);