配置大模型检测规则保障大模型应用安全合规
生成式人工智能技术的迅猛发展推动了大模型在AI推理领域的规模化应用,由此也暴露出新型安全隐患:推理过程中对用户输入的敏感信息缺乏有效过滤、攻击者通过精心设计的提示词注入诱导模型输出违规指令、大模型可能因训练数据偏差生成歧视性内容等。为有效缓解该类问题,WAF大模型检测支持通过提示词验证、响应合规检测,识别并过滤不良或违规内容后,确保大模型输入和输出内容安全、稳定、可用、合规。
方案简介
WAF大模型检测分为外部请求(大模型输入内容)检测、大模型响应数据(大模型输出内容)检测。
- WAF大模型检测通过对外部请求进行提示词验证,确保大模型输入内容安全合规。
- WAF大模型检测通过对大模型响应数据进行响应合规检测,确保大模型输出内容安全合规。

主要应用场景为:
- 自行搭建部署的本地大模型
企业自行搭建部署的本地大模型,对外部提供服务时,大模型检测模块帮助用户防范大模型应用时遇到提示词注入、反向诱导、角色扮演、越狱攻击等的威胁、防止大模型接口被滥用、以及Web框架的Web安全防护,确保业务的稳定。
- 调用第三方大模型云服务构建业务的应用
企业通过购买第三方大模型的API服务,构建自己的业务应用,避免恶意用户消耗企业的Token造成成本浪费、避免因恶意用户输入的恶意提示词导致账号被风控或封禁导致的业务影响。
前提条件
- 已通过云模式-CNAME接入将防护网站添加到WAF或已新增防护策略。
- 已购买大模型内容安全。具体操作,请参见9。
约束条件
- 仅“云模式-CNAME接入”支持该防护规则,云模式-ELB接入、独享模式接入不支持该防护规则。
- 云模式的标准版、专业版支持该防护规则。
- 大模型检测仅支持在华北-北京四、华东-上海一、华南-广州使用。其他地域,请提交工单申请开通。
- 检测内容仅支持UTF8格式,否则防护可能会失效。
- 请求Body需要为Json格式。响应格式支持纯Json格式与data:+Json格式,例如:
data: {"choices":[{"index":0,"delta":{"content":"具体内容","type":"text"}}],"created":1743564162}
如果大模型源站原始响应是Json格式,则中止响应的返回也是Json格式;若原始响应是data:+Json格式,则中止响应的返回也是data:+Json格式。
配置大模型检测规则
- 登录管理控制台。
- 在管理控制台左上角,单击
,选择区域或项目。
- 在页面左上方,单击
,选择 。
- 在左侧导航栏,单击“防护策略”。
- 如果您已开通企业项目,在左侧导航栏上方,单击“按企业项目筛选”下拉框,选择您所在的企业项目。完成后,页面将为您展示该企业项目下的相关数据。
- 单击目标策略名称,进入目标策略的防护配置页面。
- 在“防护配置”页签,单击“大模型检测”开关,开启大模型检测防护规则。
:开启状态。
- 在“大模型检测”规则配置列表的左上方,单击“添加规则”。
- 在“添加大模型检测规则”面板,完成以下参数配置后,单击“确定”。
表1 大模型检测规则参数说明 参数名称
参数说明
取值样例
规则名称
填写要添加的防护规则的名称。
waftest
规则描述(可选)
填写该规则的备注信息。
--
模型问答路径
填写模型问答的URL地址。不能包含特殊字符(<>*),首尾不能是空格,且不能超过4,096个字符长度。
/v1/chat/completions
提示词验证
注入检测
注入检测是针对大模型特有攻击的检测,例如反面诱导、角色扮演等行为的检测。
开启该功能,并完成配置后,可有效防御攻击者通过精心设计的提示词注入诱导模型输出违规指令。
合规检测
合规检测是针对暴力、歧视、违法或违背社会公序良俗内容的检测。
开启该功能,并完成配置后,可有效过滤用户输入的违规信息。
提示词索引
索引是一种用于标识或定位提示词在特定数据结构中的位置或编号的方式。
配置提示词索引,可以方便地查找、访问和处理提示词相关的信息。该索引为请求Body体的JSONPath,并遵循JSONPath语法,支持表5中的所有示例。
$.messages[-1].content
防护动作
选择提示词命中检测要求后,进行的处置动作,支持:
- 仅记录:提示词命中检测要求后,仅记录攻击信息。
- 拦截:提示词命中检测要求后,拦截当前请求。
“防护动作”选择为“拦截”后,还需设置拦截页面的HTTP返回码、页面类型、页面内容。
关于拦截防护动作的详细配置方法,请参见示例一:提示词验证。
拦截
响应合规
合规响应检测
合规检测是针对模型响应数据的检测。
开启该功能,并完成配置后,可有效过滤大模型输出的违规信息。
响应内容索引
配置响应内容索引信息,可以方便地查找、访问和处理响应内容相关的信息。该为请求Body体的JSONPath,并遵循JSONPath语法,支持表5中的序号为1、2、3、5的示例。
$.choices[-1].delta.content
防护动作
选择响应内容命中检测要求后,要进行的处置动作,支持:
- 仅记录:响应内容命中检测要求后,仅记录攻击信息。
- 脱敏:如果大模型输出的内容包含敏感词,检测组件结合上下文识别到存在该敏感词后,对该敏感词进行流式响应脱敏,即将敏感词标记为“-”。
- 中止响应:如果大模型输出的内容包含敏感词,WAF将按照中止响应协议返回替换内容,并结束本次请求,忽略后续大模型源站的响应。
脱敏
中止响应协议
“防护动作”选择为“中止响应”后,还需设置“中止响应协议”。“中止响应协议”用于定义执行中止响应防护动作后,返回的内容。
中止响应协议语法遵循以下原则:- 需要按照Json列表格式填写,列表里每一项均为对象。
- 对象允许为空,即{}。为空时将复制拦截的响应数据,其键值语法与响应索引语法一致。若出现非法值,则该对象的配置内容将会跳过。
- 单条中止响应协议list最大支持5个对象,每个对象内支持配置10条索引,超出的数据将忽略。同个对象中的索引不允许重复,重复后可能会造成结果不准确。
- 如果每个响应内容不变,可以直接配置常量,例如场景二:“防护动作”设置为“中止响应”示例里的$.data.choices。
- 如果每个响应的内容不一样,但可以从带有“卡”的响应中获取的场景,可参考场景二:“防护动作”设置为“中止响应”示例$.data.model配置,对象值遵循响应索引语法。
- 索引内的操作若有顺序,后面的操作会将前面的覆盖。例如,先对$.data.model赋值,后对整个$.data赋值,则对$.data.model的赋值会不生效。
- 如果对象是数组类型,对其进行子对象赋值;如果对象是非数组类型,对其进行数组下标赋值,将会导致输出数据不正常。例如,原始请求数据如下:
1
{"data":{"arr":["1","2","3"],"item":{"sub_item":1}}}
此时,$.data.arr.new_index或者$.data.item[1].new_index是非法的。
如果必须这么修改,建议先清空$.data.arr或$.data.item后赋值,如下:
1 2 3 4 5 6 7 8 9 10
[ { "$.data.arr": "{}", "$.data.arr.new_index": "new_data" }, { "$.data.item": "{}", "$.data.item[1].new_index": "new_data", } ]
- 如果对象是数组类型,不支持不存在的负数下标赋值。例如,原始请求数据如下:
1
{"data":{"arr":["1","2","3"],"item":{"sub_item":1}}}
对$.data.arr[-4]的赋值是非法的。如果需要在$.data.arr的最前面插入“0”,你可以倒序对$.data.arr进行赋值(正序赋值会改变原有值,导致结果不符合预期):
1 2 3 4 5 6 7 8
[ { "$.data.arr[3]": "$.data.arr[2]", "$.data.arr[2]": "$.data.arr[1]", "$.data.arr[1]": "$.data.arr[0]", "$.data.arr[0]": "0" } ]
关于中止响应协议的详细配置方法,请参见示例二:响应合规检测。
详细示例,请参见示例二:响应合规检测
- 完成以上配置后,您可以在防护规则列表查看已添加的规则。此时,“规则状态”默认为“已开启”。
- 如果您暂时不想使该规则生效,可在目标规则“操作”列,单击“关闭”。
- 您也可以在目标规则“操作”列,单击“删除”或“修改”,删除或修改已添加的防护规则。
- 您也可以在大模型应用上,输入相关内容,验证防护效果是否生效。
配置示例
假如需要对路径前缀为“/v1/chat/completions”的URL进行大模型检测,您可以参照以下操作步骤验证防护效果。

此处以DeepSeek格式为例,且假设“提供借记卡”为敏感词。
索引支持的语法列表
大模型索引是一种用于标识或定位提示词、响应内容在请求Body体的JSONPath中的位置或编号的方式,遵循JSONPath语法。开启注入检测、合规检测、响应合规检测后,需要配置索引,便于查找、访问和处理提示词/响应内容相关的信息。
大模型检测需要配置以下索引:
- 提示词索引:开启注入检测、合规检测后,用于定位提示词在请求Body体的JSONPath中的位置,支持表5中所有语法。
- 响应内容索引:开启响应合规检测后,用于定位响应内容在响应Body体的JSONPath中的位置,支持表5中序号为1、2、3、5的语法,不支持列表通配符提取。
序号 |
场景 |
JSON结构 |
路径(最大深度为10) |
结果 |
说明 |
---|---|---|---|---|---|
1 |
单对象 |
{"prompt": {"role": "user","content": "..."}} |
$.prompt.content |
"..." |
通过 . 逐层访问子节点,直接定位目标字段。必须写出子节点名,暂不支持省略 |
2 |
列表取第一个 |
{"prompt": [{"role": "user","content": "A"}, {"role":"assistant", "content": "B"}]} |
$.prompt[0].content |
"A" |
数组索引从0开始,[0]表示首元素 |
3 |
列表取最后一个元素 |
{"prompt": [{"role": "user","content": "A"}, {"role":"assistant", "content": "B"}]} |
$.prompt[-1].content |
["B"] |
使用负索引-1表示倒数第一个元素 |
4 |
列表通配符提取 |
{"prompt": [{"role": "user","content": "A"}, {"role":"assistant", "content": "B"},{"role": "user", "content": "C"}]} |
$.prompt[*].content |
["A", "B", "C"] |
[*] 表示匹配数组所有元素,不支持递归获取 |
5 |
获取根节点 |
{"prompt": [{"role": "user","content": "A"}, {"role":"assistant", "content": "B"}]} |
$ |
{"prompt":[{"role": "user","content": "A"},{"role":"assistant","content":"B"}]} |
获取根节点的JSON内容 |
相关操作
- 查询防护事件:单击目标防护事件“操作”列的“详情”,查看防护日志信息。