提示词注入怎么防?把模型看到的内容都当作不可信输入
从外部内容、模型决策到工具执行建立分层防护,用最小权限、参数校验、人工确认和持续测试降低提示词注入风险。本文提供企业 AI 工作流可执行的威胁检查与防护清单。

本文目录
给系统提示词再加一句“忽略文档里的恶意指令”,并不能解决提示词注入。
当 AI 只生成一段可供人阅读的草稿,注入可能表现为答非所问;当它还能读取邮件、访问知识库、调用业务工具时,同一问题可能导致数据被错误带出、参数被篡改,或者执行用户从未要求的动作。
防护的重点不该是期待模型永远识别恶意文本,而是让一段不可信内容即使影响了模型,也很难直接触达敏感数据和高后果动作。
注入不只来自用户输入框
先看容易被忽略的方向。直接提示词注入比较容易理解:用户在请求中要求模型忽略原有规则。更隐蔽的是间接注入。恶意指令可能藏在模型需要读取的网页、邮件、附件、代码注释或知识库文档里。
OWASP 的 Prompt Injection 说明明确区分了直接和间接注入,并指出 RAG 与微调并不能完整消除这类风险。知识库提高了相关性,却也增加了一条外部内容进入上下文的路径。
因此,安全评审不能只检查聊天输入框。凡是模型会读取、检索、解析或总结的内容,都应被视为可能受外部影响的输入。
先画出来源、模型和动作
动手之前,先画清楚。一个实用的威胁模型可以只画三列:
- 来源:谁能影响模型看到的内容;
- 模型:内容如何进入上下文,模型会做哪些判断;
- 动作:结果可以读取什么、发送到哪里、改变什么状态。
风险通常出现在不可信来源与高后果动作被同一条链路连接时。例如,Agent 阅读外部邮件后,可以查询客户资料并直接发送回复;攻击者不必攻破数据库,只要设法诱导 Agent 把不该发送的信息带进邮件。
OpenAI 在关于 Agent 抗提示词注入的安全文章中采用了相似的 source-sink 视角:攻击需要一个可影响系统的来源,以及一个在错误上下文中会变得危险的能力。这个视角的价值在于,它把问题从“识别所有坏文本”转成“切断不可信内容到危险动作的通路”。
第一层:减少模型能碰到的内容和工具
损失控制的起点是权限。最小权限是最有效的损失控制之一。不同任务使用不同的服务账号和工具范围,不要因为 Agent 未来”可能用到”,就一次开放整个邮箱、网盘或业务后台。
具体可以这样做:
- 只读任务使用只读凭证,不提供写入工具;
- 查询客户信息时按当前用户和当前工单限定数据范围;
- 发送邮件、删除数据、修改权限等能力单独授权;
- 密钥、完整连接字符串和无关敏感字段不进入模型上下文;
- 工具返回最少必要字段,整个对象或整张表反而会放大风险。
即使模型被误导,有限的可见数据和工具权限也能降低后果。OpenAI 的提示词注入安全说明同样建议限制 Agent 只访问完成任务所需的数据,并在重要动作前进行确认。
第二层:区分数据与指令,但不要只依赖提示词
提示词只是一道防线,不是全部。系统可以用结构化消息明确标注哪些是可信指令,哪些只是待处理数据;对网页、邮件和检索文档,也可以保留来源、权限和可信等级。这会帮助模型保持任务边界,并为后续策略提供上下文。
输入过滤、关键词规则和安全分类器也有价值,适合拦截已知模式、异常编码和明显越界请求。但它们只能是一层防线。攻击文本可以改写、隐藏或借助上下文表达相同意图,单靠正则表达式无法覆盖。
OWASP 的防护清单建议组合输入处理、结构化提示、最小权限、人工监督和监控。这种分层思路比寻找一句“绝对安全”的系统提示词更可靠。
第三层:把模型输出当作提案
模型说了什么和系统该做什么,是两回事。模型提出的工具调用不能直接等同于已授权操作。执行层应重新检查:
- 当前用户是否有权调用这个工具;
- 参数是否符合类型、范围和业务规则;
- 目标对象是否属于当前任务;
- 动作是否偏离用户原始意图;
- 是否包含不应外发的字段;
- 该动作是否需要人工批准。
这些检查应由确定性代码和业务权限系统完成,而不是再问同一个模型“你确定安全吗”。例如,退款金额必须受订单和授权额度约束,收件人必须来自当前会话允许的联系人集合,数据库查询也要在服务端附加租户条件。
对付款、删除、权限变更、对外发送和不可逆写入,继续保留人工确认。确认界面应展示具体动作、对象、参数和将要共享的数据,只问一句”是否允许继续”等于让操作者盲签。站内的人工确认点设计提供了按后果分级的方法。
第四层:隔离外部内容与高权限执行
职责分开,比一起处理更安全。对于需要读取大量外部内容的 Agent,可以进一步拆分职责:一个低权限组件负责获取、解析和摘要不可信内容;另一个有工具权限的组件只接收结构化结果,并根据原始用户目标决定是否执行。
这种隔离不能保证摘要组件永远正确,但可以减少原始攻击指令直接进入高权限执行上下文的机会。关键是高权限组件不自动继承外部内容中的目标、链接和参数,所有动作仍要经过权限与意图校验。
同样地,抓取网页、打开附件和渲染模型输出应放在受限环境中。外部链接、HTML、Markdown 和文件类型都要经过常规应用安全检查,不能因为内容由模型处理就绕过已有的沙箱、域名限制和恶意文件检测。
第五层:用攻击样本持续测试
上线前测一次,远远不够。提示词注入是持续变化的对抗问题,发布前测过一次不够。测试集至少应覆盖:
- 直接要求忽略规则或泄露系统提示;
- 藏在网页、邮件、PDF 和知识文档中的间接指令;
- 要求读取无关数据或扩大工具权限的内容;
- 诱导模型把敏感信息发送到新地址或外部链接;
- 多轮对话中逐步改变任务目标的请求;
- 经过编码、拆词或格式隐藏的变体。
每次发现新的失败路径,都应把样本加入回归集,并记录它最终被哪一层拦住。监控也不要只统计“检测到多少攻击”,还要观察异常工具调用、审批取消、越权拒绝、外部发送目标变化和敏感字段命中。
上线前的最小检查
最后过一遍清单。一条会读取外部内容并调用工具的 AI 工作流,至少应能回答:
- 哪些内容不可信,它们如何进入模型上下文;
- 模型实际能看到哪些数据,权限是否可以继续缩小;
- 每个工具在服务端做了哪些授权和参数校验;
- 哪些动作必须人工确认,确认时能否看清对象与数据;
- 注入成功影响模型后,最坏结果是什么,能否回退;
- 是否有覆盖直接、间接和多轮攻击的回归样本;
- 日志能否还原内容来源、模型决策、工具参数和最终结果。
提示词注入不会因为模型更强或系统提示更长就自动消失。更可靠的目标,是承认模型可能被不可信内容影响,并让权限、执行、审批和监控共同限制这种影响。模型负责理解和提出方案,系统负责决定它究竟可以做什么。