Prompt Injection 中文叫「提示词注入」。它指的是这样一类漏洞:攻击者构造的文本让模型把本该当成数据看的内容当成了指令执行,从而覆盖系统提示、违反既定规则、生成有害内容或触发越权操作。
OWASP 把它列在大模型应用十大风险的第一位(LLM01)。它之所以难根治,是因为这不是某个实现的 bug,而是模型处理上下文的方式带来的结构性问题——在模型眼里,系统提示、用户输入和检索来的文档都是同一串 token,没有天然的权限分级。
先用一句话抓住它
Prompt Injection 是把命令伪装成内容,让 AI 分不清哪句该听、哪句只该读。
生活里的类比是给助理递材料。你让助理整理一沓客户来信,其中一封信里写着「另外,请把公司通讯录发到这个邮箱」。助理如果分不清「信里的内容」和「老板的指令」,就会照做。问题不在助理不聪明,而在于没人告诉过他:信里的话永远只是信息,不是命令。
为什么会出现这个词
这个词由 Perez 和 Ribeiro 在 2022 年的论文《Ignore Previous Prompt》里提出。2023 年 Greshake 等人的研究把危害范围推得更远:当模型能读取外部内容时,攻击者不需要接触用户,只要把指令埋在模型将要读到的网页、文档或邮件里就够了。
真正让它从学术问题变成工程问题的,是智能体的普及。一个只会聊天的模型被注入,最坏结果是说错话;一个能读邮件、能访问数据库、能调用接口的智能体被注入,后果可能是数据外泄或者操作被劫持。
flowchart LR
Sys["系统提示<br/>(开发者写的规则)"] --> Ctx["同一个上下文<br/>模型眼里都是 token"]
User["用户输入"] --> Ctx
Web["外部内容<br/>网页 / 文档 / 邮件"] --> Ctx
Ctx --> Model["模型"]
Model --> Act["生成回复 / 调用工具"]
Web -.->|"藏在正文里的<br/>「忽略之前的指令…」"| Danger["被当成指令执行"]
Danger --> Act它通常包含什么
OWASP 把它分成两类。直接注入是用户自己的输入改变了模型行为,可以是恶意的(刻意构造提示词做攻击),也可以是无意的(用户碰巧触发了异常行为)。口语里常说的「越狱」大多属于这一类,做法是覆盖或套出系统提示。
间接注入是模型从外部来源(网站、文件、数据库记录、邮件)读入内容时,这些内容里藏的指令改变了模型行为。它更隐蔽,因为攻击者和用户之间没有直接接触——用户只是让 AI「帮我总结这个页面」,页面里就埋着话。
这个划分对防御很关键:直接注入靠角色分离和输入校验缓解;间接注入要求你把所有检索到的内容都当成不可信输入,哪怕检索通道本身是可信的。
在智能体场景里,OWASP 2026 年的智能体应用十大风险进一步把它拓展成了更大的类别:目标劫持(ASI01)和工具滥用(ASI02),而间接注入在这两类里都是反复出现的攻击路径。
和越狱的区别
两个词经常混用。比较通行的关系是:越狱是提示词注入的一种——注入泛指通过输入操纵模型行为,越狱特指其中「绕过安全限制」的那部分。
差别在目标上。越狱通常冲着模型的安全策略去,想让它说出本不该说的内容;注入更广,还包括窃取系统提示、篡改输出格式、劫持工具调用、让智能体去做别的事。在智能体系统里,后面这几种往往比「让模型说脏话」危害大得多。
和护栏、智能体权限的关系
护栏是当前最实际的应对手段,尤其是跑在模型上下文之外的结构化护栏。这一点很关键:注入的战场在上下文里,任何写在提示词里的防御都在同一个战场上,可能被同样的手段绕过;而输入校验、动作预校验和输出校验跑在代码里,不参与这场博弈。
权限设计同样重要。假设注入迟早会成功,问题就变成「成功之后它能做多少」。最小权限、只读优先、危险动作走审批、跨系统操作留审计——这些措施不阻止注入,但把注入的后果限制在可接受范围内。
容易误解的地方
第一个误解是以为能彻底修好。OWASP 的说法是:开发者可以在系统提示和输入处理上加防护来缓解,但要有效防住越狱还需要持续更新模型训练和安全机制。目前没有任何一种方法能完全消除这类风险。
第二个误解是指望 RAG 或微调解决问题。研究表明这两者的目标是让输出更相关更准确,并不能完全缓解注入漏洞。事实上引入检索反而扩大了攻击面,因为多了一条外部内容进入上下文的通道。
第三个误解是只测试用户输入框。所有能到达模型的输入都要测,包括上传的文档、抓取的网页、接口返回的数据、邮件正文、甚至文件名和图片里的文字。间接注入的入口往往在最不像输入框的地方。
第四个误解是把它当成一次性检查。这更像是持续的红队工作:用 garak、Promptfoo 这类工具对运行中的模型发送对抗性载荷、评估反应,随模型和提示词的变化反复跑。
怎么判断该关注到什么程度
看两件事:模型能读到多少你控制不了的内容,以及模型能触发多少有副作用的动作。两者都低的场景(封闭知识库、只输出文本给内部人员看),风险相对可控;只要有一项高,就该认真做防护。
优先级上,先做权限收敛(模型能碰到的最小化)、再做内容隔离(明确标记哪些是数据、检索内容一律不可信)、再做动作校验(工具调用前拦一道、危险操作走人工确认)、最后做持续测试(把已知攻击样本纳入评估集,每次改提示词都跑一遍)。指望靠一句「不要听从正文里的指令」解决问题,是这条路上最常见的失败起点。