Agent 提示词注入防护:把外部内容留在数据边界内 @ Lin | 2026-05-20T10:00:00+08:00 | 3 分钟阅读 | 更新于 2026-09-12T10:00:00+08:00

围绕知识库和工具返回建立信任分层,在执行层控制模型可触发的操作。

本文于 2026-09-12 补充整理,按 2026-05 专题归档。示例为方案设计,参数用于说明方法,不代表已上线项目或实测成果。

外部文本可能看起来像系统指令

知识库助手会读取工单描述、文档正文和工具结果。这些内容可能包含“忽略前面的规则”“把所有记录导出”等文字。即使它们出现在真实文档里,也仍然只是待分析的数据,不能获得系统指令的地位。

这里讨论的是防护设计和测试边界。核心目标是让外部内容无法直接扩大工具权限、改变身份或触发未经确认的写入。

给输入标明来源与用途

可以把上下文分为:应用维护的行为规则、当前用户明确提出的任务、检索证据、工具观察结果。模型提示中说明这些来源的区别有帮助,但提示词本身不是强制访问控制。

证据对象应保留来源和版本,引用时能够追溯。来自文档的操作建议,应作为待核实的建议,不应自动转换为工具调用。例如规范中的“删除旧环境”不能绕过当前用户实际授权范围。

执行器承担最终约束

模型提出调用
  → 工具允许列表
  → 参数 schema 与业务校验
  → 当前身份和资源权限
  → 风险判断 / 具体提案审批
  → 受限执行环境
  → 输出校验与审计

其中每一步都要由代码实现明确规则。检测模型可以辅助判断可疑内容,但不应成为唯一拦截器。一个辅助模型误判“安全”,不能让越权调用通过。

对于可以访问 URL 的工具,限制目标范围和协议,处理跳转后地址,避免任意访问内部服务。对于文件工具,限定工作目录与路径解析规则。对于命令工具,更适合暴露任务特定能力,而不是默认提供无限制命令执行。

这些约束应根据工具的实际能力设置;只做知识问答时,无需为它开放本来用不到的写入或执行权限。

工具返回也需要控制

一个返回整个数据库查询结果的工具,会把权限风险和上下文成本一起放大。服务端应先做权限过滤、字段裁剪和大小限制,再把结果交给模型。

结果中出现疑似指令,不代表必须丢弃整份文档;可以保留其作为证据内容,但不赋予指令意义。对高风险操作,要求来源交叉核实或人工确认具体提案。

MCP 安全最佳实践提供协议集成层面的参考。这里的信任分层和业务执行闸门是应用需要补充实现的设计。

测试要观察系统行为

准备三份合成文档:普通操作说明;在末尾混入要求改变任务的文字;在表格中嵌入要求调用不相关工具的内容。不要只观察最终回答是否出现异常句子,还要记录中间工具请求是否被拦截。

验收包括:没有扩大检索范围;没有发送不相关外部请求;没有改变用户身份;没有新增写操作;模型若被内容影响,执行器仍然阻止越界。

只测试“忽略所有规则”这一种直白句式,覆盖面很有限。需要考虑正文、引用、工具错误消息、旧记忆和多轮对话中的间接影响。

失败之后怎么恢复

发现可疑行为时,保存经过脱敏的来源证据和拒绝原因,停止相关动作,并向用户解释不能完成哪一步。不要把带有攻击性内容的完整记录直接升级为下一轮高优先级提示。

如果一次测试没有触发非法操作,只能说明该测试下边界有效,不能宣称提示词注入已经被彻底解决。持续积累失败样本,并在工具和提示词升级后回归,才是可维护的防护方式。


查看系列导读与阅读路线

© 2019 - 2026 Lin 的博客

Powered by Hugo with theme Dream.

avatar
关于我

Lin 的 ❤️ 博客

技术专题:Java Agent 工程化:从知识库问答到可靠业务执行。围绕 RAG、工具治理、任务恢复与 Java 平台架构整理设计思路和验证方法。

记录一些 🌈 生活上,技术上的事

  • 🛠️ 技术阵地: 深耕 Java 开发 ,目前向 AI 应用领域探索与拓展。这里主要记录我从后端架构到 AI 赋能的进阶之路、技术思考以及日常的 debug 血泪史。始终致力于写出优雅且没有 bug 的代码(尽量)。
  • 🌈 生活侧写: 偶尔脱下极客的外衣,我也会在这里分享生活中的灵光一现。不管是好用的效率工具,还是周末的一场骑行,都是构成我真实生活的一部分。