← Dokumentace WAF / detections / ai-security-for-apps
Příklad pravidel zmírnění
Vrátit vlastní chybu, když se uživatel zeptá na násilný nebo nenávistný obsah
Chatbot zákaznické podpory by neměl reagovat na prompty týkající se násilných trestných činů nebo nenávistných projevů. Toto vlastní pravidlo blokuje požadavek a vrací odpověď JSON, kterou vaše aplikace může analyzovat a zobrazit uživateli.
-
Když příchozí požadavky odpovídají:
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 zkontrolovat odpověď jinou než 200 a zobrazit message pole uživateli, čímž zachováte konverzační charakter zážitku místo zobrazení holé blokovací stránky.
Blokování pokusů o prompt injection z automatizovaných zdrojů mimo vaši zemi
Toto pravidlo kombinuje funkce AI Security for Apps skóre injekcí hodnotou Bot Management a zemí, ze které požadavek pochází, abyste se zaměřili na útoky s vysokou mírou jistoty pocházející z automatizovaných zdrojů. Tento vrstvený přístup výrazně snižuje míru falešně pozitivních výsledků oproti použití jediného signálu samostatně.
-
Když příchozí požadavky odpovídají:
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 (skóre bota nižší než 10).
- Pochází mimo USA, upravte kód země podle toho, kde se nacházejí vaši uživatelé.
Samotný jednotlivý signál může způsobit falešně pozitivní výsledky. Společně ale identifikují vzor silně spojený s automatizovanými útoky typu prompt injection.
Povolit finanční osobní údaje (PII) pouze z vaší interní sítě
Aplikace finančních služeb běžně zpracovává čísla kreditních karet a bankovních účtů od interních agentů, ale u externích uživatelů by měla tyto typy PII blokovat. Toto pravidlo využívá u požadavku číslo autonomního systému (ASN) k rozlišení interního provozu od veřejného provozu.
-
Když příchozí požadavky odpovídají:
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
13335ASN 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 pracovního postupu odesílat AI asistentovi finanční osobní údaje (PII), zatímco externí uživatelé jsou blokováni. Toto nastavení můžete dále upřesnit kombinací s Access tokeny služby 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 zpracování chyb mohou uživatelé vidět neupravenou chybovou stránku HTML nebo nefunkční uživatelské rozhraní.
Zde jsou dvě věci, které můžete udělat, abyste zajistili plynulý provoz.
Nastavte záložní zprávu
Definujte přívětivou výchozí zprávu, kterou vaše aplikace zobrazí vždy, když 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 narušilo uživatelské rozhraní chatu 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á pravidla blokování pomocí vlastní odpověď JSON , například { "message": "That question is outside this assistant's scope." }. Vaše aplikace pak může odpověď zpracovat a zobrazit vlastní zprávu, pokud je k dispozici, jinak použije výchozí zprávu.
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);