AI Security for Apps(原名 Firewall for AI)可以检测传入 LLM 提示中的个人身份信息(PII)。PII 检测有两种方法,您可以一起使用以实现分层防护:
- 模糊检测(AI 驱动) — AI Security for Apps 使用 AI 模型识别提示内容中的常见 PII 类型。即使 PII 以自然语言或意外格式出现,此方法也能捕获。
- 精确检测(正则表达式) — 您对原始请求正文编写带有正则表达式的 WAF 自定义规则。此方法非常适合具有已知、可预测格式的组织特定标识符。
启用 AI Security for Apps 且请求到达带有 cf-llm 标签的端点时,它会扫描提示中的 PII,并填充两个字段:
- LLM PII detected(
cf.llm.prompt.pii_detected)— 如果发现任何 PII,则为true。 - LLM PII categories(
cf.llm.prompt.pii_categories)— 发现的具体 PII 类型数组。
检测基于 Presidio ↗,这是一个数据保护与去标识化 SDK。请参阅 cf.llm.prompt.pii_categories 字段参考 获取完整的已识别类别列表。
支持的 PII 类别
| 类别 | 描述 |
|---|---|
CREDIT_CARD |
信用卡号 |
CRYPTO |
加密货币钱包地址 |
DATE_TIME |
日期或时间表达式 |
EMAIL_ADDRESS |
电子邮箱地址 |
IBAN_CODE |
国际银行账户号码 |
IP_ADDRESS |
IP 地址 |
NRP |
国籍、宗教或政治群体 |
LOCATION |
实际位置或地址 |
PERSON |
人名 |
PHONE_NUMBER |
电话号码 |
MEDICAL_LICENSE |
医疗执照号码 |
URL |
URL |
US_BANK_NUMBER |
美国银行账户号码 |
US_DRIVER_LICENSE |
美国驾照号码 |
US_ITIN |
美国个人纳税人识别号 |
US_PASSPORT |
美国护照号码 |
US_SSN |
美国社会保障号 |
UK_NHS |
英国国家医疗服务体系编号 |
UK_NINO |
英国国家保险号 |
ES_NIF |
西班牙税号 |
ES_NIE |
西班牙外国人身份识别号 |
IT_FISCAL_CODE |
意大利税号 |
IT_DRIVER_LICENSE |
意大利驾照 |
IT_VAT_CODE |
意大利增值税号 |
IT_PASSPORT |
意大利护照号码 |
IT_IDENTITY_CARD |
意大利身份证 |
PL_PESEL |
波兰国家识别号 |
SG_NRIC_FIN |
新加坡国民登记身份证 / 外国身份识别号 |
SG_UEN |
新加坡唯一实体编号 |
AU_ABN |
澳大利亚商业编号 |
AU_ACN |
澳大利亚公司编号 |
AU_TFN |
澳大利亚税号 |
AU_MEDICARE |
澳大利亚 Medicare 编号 |
IN_PAN |
印度永久账户号码 |
IN_AADHAAR |
印度 Aadhaar 编号 |
IN_VEHICLE_REGISTRATION |
印度车辆登记号码 |
IN_VOTER |
印度选民身份证 |
IN_PASSPORT |
印度护照号码 |
FI_PERSONAL_IDENTITY_CODE |
芬兰个人身份代码 |
当检测到任何 PII 类别时,cf.llm.prompt.pii_detected 字段会返回 true — 包括在正常对话中经常出现的 PERSON、DATE_TIME 和 LOCATION 等宽泛类别。仅基于此字段进行拦截,对大多数应用会产生较高的误报率。
相反,请针对 cf.llm.prompt.pii_categories 构建规则,并且只列出对您的用例重要的类别。例如,客户支持聊天机器人可能需要拦截信用卡号和 SSN,但可以安全地忽略人名和日期。从最窄的类别集开始,在 Security Analytics 中监控匹配项,并仅在需要时扩展。
-
当传入请求匹配时:
字段 运算符 值 LLM PII Detected equals True 使用编辑器时的表达式:
(cf.llm.prompt.pii_detected) -
操作:Block
-
当传入请求匹配时:
字段 运算符 值 LLM PII Categories is in Credit Card使用编辑器时的表达式:
(any(cf.llm.prompt.pii_categories[*] in {"CREDIT_CARD"})) -
操作:Block
创建两条自定义规则:
-
一条操作设置为 Block 且表达式如下的规则:
(any(cf.llm.prompt.pii_categories[*] in {"CREDIT_CARD" "US_SSN"})) -
一条操作设置为 Log 且表达式如下的规则:
(any(cf.llm.prompt.pii_categories[*] in {"EMAIL_ADDRESS"}))
如果您需要检测组织特有的自定义 PII 格式 — 例如内部员工 ID、病历号或专有账户标识符 — 可以创建对原始正文(http.request.body.raw 字段)使用正则表达式匹配的 WAF 自定义规则。
此方法通过覆盖 AI 模型本身无法识别的格式,对模糊检测形成补充。
在以下示例中,某组织使用的员工 ID 格式为 EMP- 后跟恰好六位数字(例如 EMP-482910)。
使用以下配置创建自定义规则:
-
当传入请求匹配时:
字段 运算符 值 Raw request body matches regex EMP-[0-9]{6}使用编辑器时的表达式:
(http.request.body.raw matches "EMP-[0-9]{6}") -
操作:Block
-
响应类型:Custom JSON
-
响应正文:
{ "error": "Request blocked: employee ID detected in prompt." }
限定到特定端点
要将此规则仅限定到您的 LLM 端点,请将其与路径条件组合:
| 字段 | 运算符 | 值 | 逻辑 |
|---|---|---|---|
| URI Path | equals | /api/chat |
And |
| Raw request body | matches regex | EMP-[0-9]{6} |
使用编辑器时的表达式:
(http.request.uri.path eq "/api/chat" and http.request.body.raw matches "EMP-[0-9]{6}")
| 自定义 PII 类型 | 示例格式 | 正则表达式模式 |
|---|---|---|
| 员工 ID | EMP-482910 |
EMP-[0-9]{6} |
| 病历号 | PAT/2024/00391 |
PAT/[0-9]{4}/[0-9]{5} |
| 内部账户 ID | ACCT-XX-99999 |
ACCT-[A-Z]{2}-[0-9]{5} |
| 自定义 API 密钥前缀 | sk_live_abc123... |
sk_live_[a-zA-Z0-9]{20,} |
- Cloudflare 计划要求。 正则表达式运算符(
matches和~)需要 Business 或 Enterprise 计划。 - 正文大小限制。
http.request.body.raw字段仅检查请求正文的有限部分。确切限制因计划而异。 - JSON 负载。 原始正文包含完整的 JSON 结构。您的正则表达式应考虑到提示文本嵌套在 JSON 字符串中的情况。
- 性能。 复杂的正则表达式模式可能影响规则评估时间。请尽量使模式具体。
您可以将模糊检测与精确检测一起使用,以实现分层防护:
(cf.llm.prompt.pii_detected or http.request.body.raw matches "EMP-[0-9]{6}")
此规则会拦截 AI 模型检测到任何内置 PII 类别,或正则表达式匹配到您的自定义标识符格式的请求。