Prompt Injection:为什么会被攻击
定义
Prompt 注入的产生原因与 SQL 注入相似:用户数据和系统指令被拼进同一个 消息列表,模型无法可靠区分二者。攻击者因此可以在用户输入中夹带指令,让模型执行越权、逃逸角色或泄露提示词。
说明
SQL 注入利用的是用户输入与 SQL 命令混在一起,攻击者可以注入额外命令操作数据库。Prompt 注入攻击的是大模型的 消息列表:系统提示、用户消息和助手消息最终都作为文本进入模型,用户数据与指令之间的边界并不严格。
大模型缺少类似参数化查询的机制。传统软件可以把数据和指令彻底分离,但 消息列表 会把 system、user、assistant 内容拼成统一文本,模型很难天然识别哪些部分是高优先级指令、哪些只是用户的普通数据。
常见攻击类型包括越权指令注入、角色扮演逃逸、Few-Shot 恶意注入、结构符号注入和隐喻伪装。它们的本质都是把攻击意图藏进看似普通的用户输入,诱导模型修改行为或输出本应保密的内容。
边界与误区
Prompt 注入为什么不能像 SQL 注入一样用参数化解决: 因为大模型没有把“指令”和“数据”严格分离的执行机制。SQL 数据库可以预编译指令再绑定数据,而大模型的 消息列表 只是文本拼接,模型靠语言理解判断边界,无法保证把用户数据当作纯数据处理。
攻击者为什么能通过普通用户消息攻击模型: 所有消息最终都会进入模型的上下文,如果系统提示没有足够有效的约束,模型可能把“忽略之前指令”这类内容理解成新的要求。攻击者利用的正是模型对文本含义的服从能力与数据/指令边界不明。
Prompt 注入主要会造成哪些后果: 可能让模型泄露 System Prompt、绕过角色限制、输出违规内容、执行未授权操作,或者按照攻击者设定的规则回应用户。风险取决于应用权限和输出是否被直接执行。